2013-08-21 27 views
7

Właśnie zapoznałem się z kolejkami priorytetowymi i pomyślałem, że spróbuję, jak zachowuje się przy porównywalnym interfejsie.Kolejki priorytetów Java i porównywalny interfejs

Code Snippet:

import java.util.PriorityQueue; 

class kinga implements Comparable<Double> { 
    double time=909.909; 
    double d; 

    public kinga(double a) { 
     this.d=a; 
    } 

    public int compareTo(Double d) { 
     return Double.compare(d, time); 
    } 

    public static void main(String arg[]) { 
     PriorityQueue<kinga> r=new PriorityQueue<kinga>(); 

     r.add(new kinga(4545.45)); 
     r.add(new kinga(45.4)); 
     r.add(new kinga(1235.45)); 

     System.out.println(r.poll()+" "+r.poll()+" "+r.poll()); 
    } 
} 

To kompiluje ale daje mi wyjątek w wątek "głównym"java.lang.ClassCastException: kinga cannot be cast to java.lang.Double.

Co jest nie tak? Czy ktoś może mi powiedzieć, jak działają porównywalne i priorytetowe kolejki?

+0

zobacz moją odpowiedź na edytowany kod i wynik dla tego samego. –

Odpowiedz

8

kinga powinna być porównywalna z kinga, nie Double, więc:

class kinga implements Comparable<kinga> 

co oznacza metoda compareTo musi zostać zmieniona w ten sposób:

public int compareTo(kinga o) { 
    return Double.compare(o.d, d); 
} 
+0

Masz na myśli 'Double.compare (o.d, d)', prawda? –

+0

@JBNizet Nie jestem pewien, oryginał był "Double.compare (d, czas);", więc nie zmieniłem tego – Katona

+0

Ale to nie ma żadnego sensu. –

2

PriorityQueue<kinga> będą oczekiwać Comparable<kinga> w metodzie add . Podjęcie Comparable<Dobule> zamiast rzuca ClassCastException

8
class kinga implements Comparable<Double> 

To nie ma sensu. Chociaż twoja klasa porównuje grzywnę z Double, Double nie zdaje sobie z tego sprawy i nie porówna grzywny z instancjami Kinga, co złamie umowę Comparable. A ponieważ Kinga nie może się równać z inną króla, nie można użyć PriorityQueue<kinga>.

Powinno być

class Kinga implements Comparable<Kinga> 

(należy zwrócić uwagę na górnym przypadku, aby przestrzegać konwencji nazewnictwa Java), co oznacza, że: przypadki Kinga są porównywalne ze sobą.

Metoda compareTo powinny być

@Override 
public int compareTo(Kinga other) { 
    return Double.compare(this.d, other.d); 
} 

co oznacza: Jestem większy niż innym Kinga czy mój d jest większa niż druga Kingi d.

+0

przy okazji, 'PriorityQueue 'jest prawdopodobnie kolejnym przykładem poświęcenia bezpieczeństwa typu dla elastyczności: jeśli został zadeklarowany jako' klasa PriorityQueue > ', to błąd ten zostałby przechwycony w czasie kompilacji, ale wtedy można by było umieścić tylko elementy z naturalną kolejnością do kolejki – Katona

+2

+1 Aby dojechać do domu, rozważ "Kinga k; Podwójne d; '. W tym przypadku "k.compareTo (d);" działa dobrze, ale co powiesz na "d.compareTo (k)"? Kolejka priorytetowa wywoła ją czasami, co jest przyczyną wyjątku. – yshavit

0
Can somebody tell me how comparable and priority queues work? 

Najpierw pobierz difference między interfejsami Porównywalny i Komparator.

Teraz za to pytanie można coś zrobić jak poniżej

Najpierw utwórz Komparator dla Kingi

class comparableKinga implements Comparator<kinga> { 

@Override 
public int compare(kinga o1, kinga o2) { 
    return Double.compare(o1.getD(),o2.getD()); 
} 
} 

Następnie utworzyć priorytet kolejki z tego komparatora w konstruktorze

class kinga { 

double d; 

public kinga(double a) { 
    this.d = a; 
} 

public double getD() { 
    return this.d; 
} 

@Override 
public String toString() { 
    return "kinga{" + 
      "d=" + d + 
      '}'; 
} 

public static void main(String arg[]) { 
    PriorityQueue<kinga> r = new PriorityQueue<kinga>(11,new comparableKinga()); 


    r.add(new kinga(4545.45)); 
    r.add(new kinga(45.4)); 
    r.add(new kinga(1235.45)); 

    System.out.println(r.poll() + " " + r.poll() + " " + r.poll()); 
} 
} 

Wyjście jest zgodny z oczekiwaniami:

kinga{d=45.4} kinga{d=1235.45} kinga{d=4545.45} 
+0

Czy możesz rzucić okiem na moje użycie PriorityQueue w tym pytaniu? http://stackoverflow.com/questions/28800287/how-to-restore-the-priorityqueue-to-its-initial-state-fore-the-method-call?noredirect=1#comment45875800_28800287 – committedandroider

Powiązane problemy