Реализация 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;
}
}