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