2010-03-24 9 views
11
List<MyClass> myclassList = (List<MyClass>) rs.get(); 

TreeSet<MyClass> myclassSet = new TreeSet<MyClass>(myclassList); 

Ich verstehe nicht, warum dieser Code erzeugt dies:Liste TreeSet Umwandlung erzeugt: "java.lang.ClassCastException: MyClass kann nicht auf java.lang.Comparable gegossen werden"

java.lang.ClassCastException: MyClass cannot be cast to java.lang.Comparable 

MyClass tut vergleichbares nicht implementieren. Ich möchte nur ein Set verwenden, um die eindeutigen Elemente der Liste zu filtern, da meine Liste unnötige Duplikate enthält.

Antwort

18

Ist MyClass implements Comparable<MyClass> oder etwas ähnliches?

Wenn nicht, dann deshalb.

Für TreeSet müssen Sie entweder die Elemente Comparable eingeben oder eine Comparator angeben. Ansonsten kann TreeSet nicht funktionieren, da es nicht wissen würde, wie man die Elemente anordnet.

Denken Sie daran, TreeMap implements SortedSet, so muss es wissen, wie die Elemente auf die eine oder andere Weise zu bestellen.

Sie vertraut machen sollten, sich mit, wie die Umsetzung Comparable definiert natürliche Ordnung für Objekte eines bestimmten Typs.

Die Schnittstelle definiert eine Methode, compareTo, die eine negative Ganzzahl, Null oder eine positive Ganzzahl zurückgeben muss, wenn dieses Objekt kleiner, gleich oder größer als das jeweils andere Objekt ist.

Der Vertrag erfordert dass:

  • sgn(x.compareTo(y)) == -sgn(y.compareTo(x))
  • es transitiv ist: x.compareTo(y)>0 && y.compareTo(z)>0 impliziert x.compareTo(z)>0
  • x.compareTo(y)==0 impliziert, dass sgn(x.compareTo(z)) == sgn(y.compareTo(z)) für alle z

Zusätzlich ist es empfiehlt dass:

  • (x.compareTo(y)==0) == (x.equals(y)), das heißt „im Einklang mit equals

Dieses viel erscheinen mag auf den ersten verdauen, aber es ist wirklich ganz natürlich mit wie eine totale Ordnung definiert.


Wenn Ihre Objekte können nicht eine oder andere Weise bestellt werden, dann wäre ein TreeSet keinen Sinn. Vielleicht möchten Sie stattdessen einen HashSet verwenden, der eigene Verträge hat. Sie sind wahrscheinlich zu @Override hashCode() und equals(Object) als geeignet für Ihre Art erforderlich werden (siehe: Overriding equals and hashCode in Java)

+0

MyClass implementiert nicht vergleichbar. Ich möchte nur ein Set verwenden, um die eindeutigen Elemente der Liste zu filtern, da meine Liste unnötige Duplikate enthält. – Chuck

+2

Verwenden Sie dann ein HashSet. Es versucht nicht, die Elemente zu sortieren. –

2

Wenn Sie keine explizite Comparator an eine TreeSet übergeben, wird es versuchen, die Objekte zu vergleichen (unter der Annahme, dass sie Comparable sind). Und wenn sie nicht Comparable sind, kann sie sie nicht vergleichen, deshalb wird diese Ausnahme geworfen!
TreeSets sind sortierte Sätze und erfordern, dass Objekte Comparable oder Comparator übergeben werden, um zu bestimmen, wie die Objekte in dem Set sortiert werden.

1

Wenn Sie nur die Menge wollen Duplikate entfernen, eine HashSet verwendet, obwohl, dass die Reihenfolge der Objekte, die von der zurück wird mische Iterator in Arten, die zufällig erscheinen.
Aber wenn Sie die Reihenfolge etwas erhalten möchten, verwenden Sie LinkedHashSet, die zumindest die Reihenfolge der Liste beibehalten wird.

TreeSet ist nur dann sinnvoll, wenn Sie die Set müssen sortiert werden, entweder durch die Implementierung des Objekts von Comparable oder durch eine benutzerdefinierte Comparator zum TreeSet's Konstruktor übergeben.

Verwandte Themen