Java-priority-queues und vergleichbare Schnittstelle
Ich habe gerade das lernen über priority-queues und dachte, ich würde versuchen, wie verhält es sich mit vergleichbaren 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, aber der gibt mir Ausnahme in thread "main" java.lang.ClassCastException: kinga cannot be cast to java.lang.Double
.
Was ist hier falsch. Kann jemand mir sagen, wie vergleichbar und priority-queues arbeiten?
- siehe meine Antwort für den bearbeiteten code und die Ausgabe für den gleichen.
Du musst angemeldet sein, um einen Kommentar abzugeben.
kinga
sollten vergleichbar sein mitkinga
, nichtDouble
so:was bedeutet, dass Ihre
compareTo
Methode wird geändert, um dies:Double.compare(o.d, d)
, richtig?Double.compare(d, time);
, so dass ich das auch nicht ändernDas macht keinen Sinn. Obwohl Sie in Ihrer Klasse zu vergleichen mit feinen Doppel -, ist sich nicht bewusst, dass, und nicht zu vergleichen, gut mit Instanzen von kinga, die brechen die Vergleichbaren Vertrag. Und da eine kinga ist nicht zu vergleichen mit anderen kinga, die Sie nicht verwenden können, eine
PriorityQueue<kinga>
.Sollte es
(beachten Sie die Großschreibung zu achten, die Java naming conventions), was bedeutet: Kinga Instanzen sind vergleichbar zusammen.
Die compareTo-Methode sollte
was bedeutet: ich bin größer als der andere Kinga, wenn mein
d
ist größer als die anderen Kinga istd
.PriorityQueue
ist möglicherweise ein anderes Beispiel zu opfern, geben Sicherheit für die Flexibilität: wenn es erklärt wurde, wieclass PriorityQueue<E extends Comparable<E>>
, dann wird dieser Fehler erkannt worden, zur compile-Zeit, aber dann werden nur die Elemente mit natürlichen Bestellung könnte in der WarteschlangeKinga k; Double d;
. In diesem Fallk.compareTo(d);
funktioniert gut, aber was ist mit 'd....compareTo(k)`? Die priority-queue aufrufen, die letzteren manchmal, das ist, was die Ausnahme verursacht.PriorityQueue<kinga>
erwartenComparable<kinga>
imadd
Methode. Die übergabe einesComparable<Dobule>
stattdessen wirftClassCastException
Zunächst die Unterschied zwischen Vergleichbaren und Komparator-Schnittstellen.
Nun für Ihre Frage, die Sie tun können, so etwas wie unten
Erstellen Sie zuerst eine Komparator für Kinga
Dann erstellen Sie Ihre priority queue mit diesem Comparator im Konstruktor
Ausgabe ist wie erwartet