Beispiel für TreeSet mit Comparable in Java

Das erste Beispiel unten zeigt einen Fehler, der auftritt, wenn ein Objekt zu einer Liste vom Typ Set hinzugefügt wird. In einem Set muss jedes Element eindeutig sein, weshalb ein Objekt im Vergleich zu den Objekten in TreeSet, bevor es eingefügt wurde.

Schauen wir uns zunächst den folgenden Code an, der drei "Point"-Objekte erstellt und sie zu TreeSet hinzufügt.

import java.util.TreeSet; 

class Punkt {
int x,y;
public Point(int x, int y){
this.x = x;
this.y = y;
}
}

public class ImpComparableWrong {

public static void main(String[] args) {
TreeSet d = new TreeSet();
d.add(neuer Punkt(2,4));
d.add(neuer Punkt(1,7));
d.add(neuer Punkt(5,3));

System.out.println(d.size());
}
}
Kompilierung und Ausführung gibt folgendes Ergebnis zurück:

Ausnahme im Thread "main" java.lang.ClassCastException: TreeSet.Point kann nicht in java.lang.Comparable
bei java.util.TreeMap.compare(Unbekannte Quelle)
bei java.util.TreeMap.put(Unbekannte Quelle)
bei java.util.TreeSet.add(Unbekannte Quelle)
bei TreeSet.Comparable.main(Comparable.java:17)
Der Grund dafür ist, dass die Point-Klasse die Schnittstelle implementieren muss Comparable damit das TreeSet Point-Objekte aufnehmen kann. Das hinzugefügte Objekt kann nicht mit den Elementen in TreeSet verglichen werden, die Methode add() löst eine Ausnahme aus ClassCastException. Um ein Objekt vergleichbar zu machen, müssen Sie die Comparable.
Der folgende Code korrigiert diesen Fehler, indem er die Schnittstelle Comparable implementiert:

import java.util.Iterator; 
import java.util.TreeSet;

class Point implementiert Comparable{
int x,y;
public Point(int x, int y){
this.x = x;
this.y = y;
}

public int compareTo(Point p) {
double dp2 = (double) Math.sqrt(Math.pow(p.x,2) + Math.pow(p.y,2));
double dp = (doppelt) Math.sqrt(Math.pow(x,2) + Math.pow(y,2));
if(dp > dp2)
return 1;
else
return 0;
}
}

public class Comparabletest {

public static void main(String[] args) {
TreeSet tset = new TreeSet();
tset.add(neuer Punkt(2,4));
tset.add(neuer Punkt(1,7));

Punkt a = neuer Punkt(2,5);

Iterator iterator = tset.iterator();
while(iterator.hasNext()){
Punkt p = iterator.next();
System.out.print(p.x +", "+ p.y);
System.out.println(" | p > a: "+p.compareTo(a));
}
}
}
Dieses Programm gibt folgendes Ergebnis aus:

2, 4 | p > A: 0
1, 7 | p > a: 1
References:
Javadoc: TreeSet class