2013-08-21 7 views
7

Ich habe gerade über Prioritätswarteschlangen gelernt und dachte, ich würde versuchen, wie es sich mit vergleichbarer Schnittstelle verhält.Java Priority Queues und vergleichbare Schnittstelle

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()); 
    } 
} 

Es kompiliert, sondern gibt mir Exception in thread "main"java.lang.ClassCastException: kinga cannot be cast to java.lang.Double.

Was ist hier falsch? Kann mir jemand sagen, wie vergleichbar und prioritär Warteschlangen arbeiten?

+0

sehe meine Antwort für den bearbeiteten Code und Ausgabe für die gleiche. –

Antwort

8

kinga sollte so mit kinga, nicht Double, vergleichbar sein:

class kinga implements Comparable<kinga> 

was bedeutet, Ihre compareTo Methode dies geändert werden muss:

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

Sie meinen 'Double.compare (o.d, d)', richtig? –

+0

@ JBNizet Ich bin mir nicht sicher, das Original war 'Double.compare (d, Zeit);', also habe ich das nicht geändert – Katona

+0

Aber es macht keinen Sinn. –

2

PriorityQueue<kinga>Comparable<kinga> im add Verfahren erwarten, . Übergeben eines Comparable<Dobule> stattdessen wirft ClassCastException

8
class kinga implements Comparable<Double> 

, die keinen Sinn macht. Obwohl Ihre Klasse gut mit Double verglichen werden kann, ist sich Double dieser Tatsache nicht bewusst und wird nicht mit Instanzen von Kinga verglichen, die den Comparable-Vertrag brechen. Und da ein Kinga sich nicht mit einem anderen Kinga vergleichen lässt, können Sie keinen PriorityQueue<kinga> verwenden.

Es sollte

class Kinga implements Comparable<Kinga> 

(beachten Sie die Großbuchstaben, die Java-Namenskonventionen zu respektieren), was bedeutet: Kinga Instanzen zusammen vergleichbar sind.

sollte die Methode compareTo

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

sein, was bedeutet: Ich bin größer als eine andere Kinga, wenn mein dd größer als die anderen Kinga ist.

+0

Übrigens, 'PriorityQueue 'ist möglicherweise ein weiteres Beispiel dafür, Typsicherheit für Flexibilität zu opfern: wenn es als Klasse priorityQueue >' deklariert worden wäre, wäre dieser Fehler zur Kompilierzeit abgefangen worden, aber dann könnten nur Elemente mit natürlicher Reihenfolge eingefügt werden in die Warteschlange – Katona

+2

+1 Um es nach Hause zu fahren, betrachte 'Kinga k; Doppelter d; '. In diesem Fall funktioniert 'k.compareTo (d);' gut, aber was ist mit 'd.compareTo (k) '? Die Prioritätswarteschlange wird das letztere manchmal aufrufen, was die Ausnahme verursacht. – yshavit

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

Zuerst erhalten Sie die difference zwischen Comparable und Komparator-Schnittstellen.

Jetzt für Ihre Frage kann man so etwas tun unten

Zuerst erstellen Vergleicher für Kinga

class comparableKinga implements Comparator<kinga> { 

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

dann Ihre Prioritätswarteschlange mit diesem Vergleicher im Konstruktor

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()); 
} 
} 

Ausgabe ist wie erwartet

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

Können Sie in dieser Frage einen Blick auf meine PriorityQueue werfen? http://stackoverflow.com/questions/28800287/how-to-restore-the-priorityqueue-to-it-initial-state-before-the-method-call?noredirect=1#comment45875800_28800287 – committedandroider