Liste zu TreeSet Umwandlung erzeugt: „java.lang.ClassCastException: MyClass kann nicht auf java.lang.Comparable gegossen werden“

StackOverflow https://stackoverflow.com/questions/2504803

  •  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.

War es hilfreich?

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 impliziert x.compareTo(z)>0
  • x.compareTo(y)==0 impliziert, dass sgn(x.compareTo(z)) == sgn(y.compareTo(z)) für alle z

Darüber hinaus ist es empfiehlt , dass:

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

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top