Реализация Java Comparator
Я пытаюсь написать алгоритм, который использует очередь с минимальным приоритетом, поэтому я просмотрел google и нашел PriorityQueue. Похоже, что для его использования мне нужно будет сказать, как я хочу, чтобы он определил приоритеты, и что способ сделать это с помощью компаратора (я хочу сравнить конкретные поля данных моего "Node1", объекты). Больше googling представило идею создания нового компаратора, который реализует Comparator, но переопределяет метод сравнения. Я пытаюсь это (и другие варианты его):
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;
}
}
Компилятор протестует по нескольким причинам, одним из которых является то, что я не переубедил класс компаратора (который, как он говорит, является абстрактным)
error: distComparator не является абстрактным и не переопределяет сравнение абстрактного метода (Object, Object) в Comparator
Я переключил его, чтобы сказать "compare (object x, object y)", который позаботится об этой проблеме. На данный момент, хотя компилятор жалуется, что он не может найти переменную dist в x или y, что имеет смысл, поскольку они являются частью моего класса Node1, а не класса Object.
Итак, как это должно работать? Он должен иметь тип Object
, по-видимому, но как я могу направить его на правильную переменную?
Ответы
Ответ 1
Вам нужно реализовать 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
.)
Ответ 2
Как вы видите здесь. Интерфейс Comparator
имеет общее описание того, для какого типа этот компаратор предназначен. И на самом деле PriorityQueue
.
Итак, если вы создаете PriorityQueue<Node1>
, вы можете создать Comparator<Node1>
:
public class distComparator implements Comparator<Node1> {
@Override
public int compare(Node1 x, Node1 y){
return x.dist - y.dist;
}
}