#java #generics #comparator #bluej
#java #общие #компаратор #bluej
Вопрос:
Мне была поставлена задача: написать общий класс WeightedElement<E,W>, в котором хранится элемент типа E и вес типа W. Он должен реализовывать Comparable, полагаясь на функцию W compareTo() . Вы должны обеспечить, чтобы W сам по себе был сопоставимым.
До сих пор я создал класс и реализовал comparable, но столкнулся с проблемой при создании метода compareTo () для W. У меня есть:
public class WeightedElement<E, W extends Comparable<W>> {
public E element;
public W weight;
public WeightedElement() {
element = this.element;
weight = this.weight;
}
public int compareTo(W data) {
if (this.weight == data.weight) {
return 0;
} else if (this.weight < data.weight) {
return 1;
} else {
return 1;
}
}
}
Я сталкиваюсь с проблемой, заключающейся в том, что при сравнении весов вес для данных не найден. Также существуют ли какие-либо другие методы, которые я должен создать, чтобы правильно иметь класс, который реализует comparable для одной из переменных? Спасибо за любую помощь
Комментарии:
1. В соответствии с вашим назначением ваш WeightedElement должен реализовывать Comparable . Затем, чтобы он полагался на сопоставимость W, напишите простую прокси-функцию, например
public int compareTo(WeightedElement<E,W> data) { return this.weight.compareTo(data.weight); }
Ответ №1:
У вас есть правильные обобщения, но, как WeightedElement
и у него, вам нужно вызывать compareTo
веса — вы не можете использовать <
или ==
для сравнения.
Ответ №2:
public class WeightedElement<E, W extends Comparable<W>> implements Comparable<WeightedElement<E, W>> {
private final E element;
private final W weight;
public WeightedElement(E element, W weight) {
this.element = element;
this.weight = Objects.requireNonNull(weight, "'weight' should not be null");
}
@Override
public int compareTo(WeightedElement<E, W> other) {
return other == null ? 1 : weight.compareTo(other.weight);
}
}