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