Liste zu TreeSet Umwandlung erzeugt: „java.lang.ClassCastException: MyClass kann nicht auf java.lang.Comparable gegossen werden“
-
22-09-2019 - |
Frage
List<MyClass> myclassList = (List<MyClass>) rs.get();
TreeSet<MyClass> myclassSet = new TreeSet<MyClass>(myclassList);
Ich verstehe nicht, warum dieser Code generiert diese:
java.lang.ClassCastException: MyClass cannot be cast to java.lang.Comparable
MyClass nicht Comparable implementieren. Ich möchte nur ein Set verwenden, um die einzigartigen Elemente der Liste zu filtern, da meine Liste unncessary Duplikate enthält.
Lösung
Does MyClass implements Comparable<MyClass>
oder so etwas?
Wenn nicht, dann deshalb.
Für TreeSet
, müssen Sie entweder die Elemente Comparable
machen, oder eine Comparator
bieten. Andernfalls können TreeSet
nicht funktionieren, da sie nicht wissen, wie die Elemente bestellen.
Denken Sie daran, TreeMap implements SortedSet
, so ist es, wie um zu wissen, hat
die Elemente eine oder andere Weise.
Sie sollten sich vertraut machen mit, wie die Umsetzung Comparable
definiert natürliche Ordnung für Objekte eines bestimmten Typs.
Die Schnittstelle definiert eine Methode, compareTo
, die eine negative ganze Zahl zurückkehren müssen, Null oder eine positive ganze Zahl, wenn dieses Objekt kleiner als, gleich oder größer als das andere Objekt verbunden.
Der Vertrag erfordert , dass:
-
sgn(x.compareTo(y)) == -sgn(y.compareTo(x))
- es ist transitiv:
x.compareTo(y)>0 && y.compareTo(z)>0
impliziertx.compareTo(z)>0
-
x.compareTo(y)==0
impliziert, dasssgn(x.compareTo(z)) == sgn(y.compareTo(z))
für allez
Darüber hinaus ist es empfiehlt , dass:
-
(x.compareTo(y)==0) == (x.equals(y))
, das heißt „im Einklang mitequals
Das mag viel erscheinen zunächst zu verdauen, aber wirklich ist es ganz natürlich, mit wie man definiert totale Ordnung.
Wenn Sie Ihre Objekte können nicht eine oder andere Weise bestellt werden, dann wäre ein TreeSet
keinen Sinn. Sie können eine HashSet
stattdessen verwendet werden soll, die ihre eigenen Verträge haben. Sie sind wahrscheinlich zu @Override hashCode()
und equals(Object)
als geeignet für Ihre Art erforderlich werden (siehe: Zwingende gleich und hashCode in Java )
Andere Tipps
Wenn Sie keinen expliziten Comparator
zu einem TreeSet
passiert, wird es versuchen, die Objekte zu vergleichen (unter der Annahme, sie sind Comparable
). Und wenn sie nicht Comparable
sind, ist es nicht, sie zu vergleichen, so dass diese Ausnahme ausgelöst wird!
TreeSets
sortierte Sets und erfordert entweder Objekte Comparable
oder ein Comparator
sein in übergeben werden, um zu bestimmen, wie die Objekte in der Set
zu sortieren.
Wenn Sie nur den Satz wollen Duplikate zu entfernen, eine HashSet
verwendet, obwohl das wird die Reihenfolge der Objekte zurückgegeben durch die Iterator
in einer Weise mischt, die zufällig erscheinen.
Aber wenn Sie die Bestellung etwas, Verwendung LinkedHashSet
bewahren wollen, dass zumindest die Einfügung Reihenfolge der Liste erhalten.
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.