2013-04-05 2 views
12

Я пытаюсь написать алгоритм, который использует очередь с минимальным приоритетом, поэтому я просмотрел google и нашел PriorityQueue. Похоже, что для его использования мне нужно будет сказать, как я хочу, чтобы он определил приоритеты, и что способ сделать это с помощью компаратора (я хочу сравнить конкретные поля данных моего «Node1», объекты). Больше googling представило идею создания нового компаратора, который реализует Comparator, но переопределяет метод сравнения. То, что я пытаюсь это это (и другие вариации него, а):Реализация Java 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 is not abstract and does not override abstract method compare(Object,Object) in Comparator

Я переключился сказать «сравнивать (объект х, у) объект», который ухаживает за этим вопросом. На данный момент, хотя компилятор жалуется, что он не может найти переменную dist в x или y, что имеет смысл, поскольку они являются частью моего класса Node1, а не класса Object.

Как это должно работать? По-видимому, он должен иметь тип Object, но как же я могу направить его на правильную переменную?

ответ

15

Вы должны реализовать 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.)

+0

Вы также можете написать 'обратный x.dist - y.dist' – Polygnome

+1

@Polygnome: В зависимости от диапазонов, участвующих это может быть или не работает для целых чисел, но является полным не стартером для значений с плавающей запятой. – NPE

+0

Спасибо! Решено! –

2

As вы можете видеть here. Интерфейс 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; 
    } 
} 
+2

используйте '<>' вместо '[]' –

Смежные вопросы