Реализация Java Компаратора
Я пытаюсь написать алгоритм, который использует очередь с минимальным приоритетом, поэтому я посмотрел на google и нашел PriorityQueue. Кажется, что для того, чтобы использовать его, мне нужно сказать ему, как я хочу, чтобы он определял приоритеты, и что способ сделать это-с помощью компаратора (я хочу сравнить конкретные поля данных моих объектов "Node1"). Больше googling представил идею создания нового компаратора, который реализует компаратор, но переопределяет метод сравнения. Я пытаюсь ... это (и другие его варианты):
import java.util.Comparator;
public class distComparator implements Comparator {
@Override
public int compare(Node1 x, Node1 y){
if(x.dist<y.dist){
return -1;
}
if(x.dist>y.dist){
return 1;
}
return 0;
}
}
компилятор протестует по нескольким причинам, одна из которых заключается в том, что я не переехал класс comparator (который, как он говорит, является абстрактным)
ошибка: distComparator не является абстрактным и не переопределяет абстрактный метод compare (Object,Object) в Comparator
я переключил его, чтобы сказать " сравнить (объект x, Объект y)", который заботится об этой проблеме. На данный момент, хотя компилятор жалуется, что не может найти переменную "dist" в x или y-что имеет смысл, поскольку они являются частью моего класса Node1, а не класса Object.
Так, как это должно работать? Он должен иметь тип Object, по-видимому, но как тогда направить его на правильную переменную?
2 ответов
вам нужно реализовать Comparator<Node1>:
public class distComparator implements Comparator<Node1> {
^^^^^^^
без этого вы реализуете Comparator<Object>, что не то, что вы хотите (его можно заставить работать, но не стоит хлопот).
остальная часть кода в вашем вопросе в порядке, при условии Node1 имеет доступный член под названием dist.
обратите внимание, что если вы используете Java 7, все тело метода можно заменить на
return Integer.compare(x.dist, y.dist);
(вместо Integer С Double и т. д., В зависимости от по типу Node1.dist.)
Как видите,здесь (Страница JSE Comparator JavaDoc),
the Comparator интерфейс имеет общий " параметр"
описывая тип
для чего этот компаратор конструирован.
The PriorityQueue аналогично.
так,
если вы создадите PriorityQueue<Node1>,
вы можете создать Comparator<Node1> следующим образом:
public class distComparator implements Comparator<Node1> {
@Override
public int compare(Node1 x, Node1 y){
return x.dist - y.dist;
}
}