2013-04-05 20 views
12

Próbuję napisać algorytm, który używa kolejki o priorytecie min, więc rozejrzałem się po Google i znalazłem PriorityQueue. Wydaje się, że aby go użyć, będę musiał powiedzieć, jak chcę, aby był priorytetowy, i że sposobem na to jest porównanie z komparatorem (chcę porównać konkretne pola danych mojego "Węzła 1" obiekty). Więcej googlowania przedstawiło ideę stworzenia nowego komparatora, który implementuje Komparator, ale zastępuje metodę porównywania. Co staram się to (i inne odmiany tego również):Implementowanie 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; 
    } 
} 

Protesty kompilatora z kilku powodów, z których jeden jest to, że nie mam zbyt jeździł klasa komparatora (który mówi, że jest to streszczenie)

error: distComparator is not abstract and does not override abstract method compare(Object,Object) in Comparator

Zmieniłem go, aby powiedzieć "porównaj (obiekt x, obiekt y)", który zajmuje się tym problemem. W tym momencie kompilator narzeka jednak, że nie może znaleźć zmiennej "dist" w x lub y - co ma sens, ponieważ są one częścią mojej klasy Node1, a nie klasy Object.

Jak to ma działać? Najprawdopodobniej powinien mieć typ Object, ale jak skierować go do właściwej zmiennej?

Odpowiedz

15

Trzeba wdrożyć Comparator<Node1>:

public class distComparator implements Comparator<Node1> { 
               ^^^^^^^ 

Bez tego jesteś wykonawczych Comparator<Object>, co nie jest to, co chcesz (może to być wykonane do pracy, ale nie jest warte wysiłku).

Reszta kodu w pytaniu jest w porządku, pod warunkiem, że Node1 ma dostępnego członka o nazwie dist.

Zauważ, że jeśli używasz Java 7, całe ciało metody mogą być zastąpione

return Integer.compare(x.dist, y.dist); 

(zastąpić Integer z Double etc, w zależności od rodzaju Node1.dist.)

+0

Można również napisać 'x.dist powrotny - y.dist' – Polygnome

+1

@Polygnome: W zależności od zakresów zaangażowanych ten może lub nie działa dla liczb całkowitych, ale jest kompletnym non-starterem dla wartości zmiennoprzecinkowych. – NPE

+0

Dziękujemy! Rozwiązany! –

2

jako widać here. Interfejs Comparator zawiera ogólny opis typu, dla którego przeznaczony jest ten komparator. I faktycznie także PriorityQueue.

Więc jeśli tworzysz PriorityQueue<Node1>, można utworzyć Comparator<Node1>:

public class distComparator implements Comparator<Node1> {  
    @Override 
    public int compare(Node1 x, Node1 y){ 
     return x.dist - y.dist; 
    } 
} 
+2

użyj '<>' zamiast '[]' –