Liste à la conversion TreeSet produit: « java.lang.ClassCastException: MyClass ne peut pas être jeté à java.lang.Comparable »

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

  •  22-09-2019
  •  | 
  •  

Question

List<MyClass> myclassList = (List<MyClass>) rs.get();

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

Je ne comprends pas pourquoi ce code génère ceci:

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

MyClass ne met pas en œuvre Comparable. Je veux juste utiliser un ensemble pour filtrer les éléments uniques de la liste depuis ma liste contient des doublons unncessary.

Était-ce utile?

La solution

Est-ce que MyClass implements Comparable<MyClass> ou quelque chose comme ça?

Sinon, voilà pourquoi.

Pour TreeSet, vous devez soit faire les éléments Comparable, ou fournir un Comparator. Dans le cas contraire TreeSet ne peut pas fonctionner, car il ne sait pas comment commander les éléments.

Rappelez-vous, TreeMap implements SortedSet, il doit savoir comment commander les éléments dans un sens ou un autre.

Vous devez vous familiariser avec la mise en œuvre Comparable définit ordre naturel pour les objets d'un type donné.

L'interface définit une méthode, compareTo, qui doit retourner un entier négatif, nul ou un nombre entier positif si cet objet est inférieure, égale ou supérieure à l'autre objet, respectivement.

Le contrat nécessite que:

  • sgn(x.compareTo(y)) == -sgn(y.compareTo(x))
  • il est transitif: x.compareTo(y)>0 && y.compareTo(z)>0 implique x.compareTo(z)>0
  • x.compareTo(y)==0 implique que sgn(x.compareTo(z)) == sgn(y.compareTo(z)) pour tous z

En outre, il recommande que:

  • (x.compareTo(y)==0) == (x.equals(y)), à savoir « compatible avec equals

Cela peut sembler beaucoup à digérer au début, mais vraiment il est tout à fait naturel comment on définit la commande totale.


Si vos objets ne peuvent pas être commandés d'une façon ou d'une autre, puis un TreeSet ne serait pas logique. Vous pouvez utiliser un HashSet à la place, qui ont ses propres contrats. Vous êtes susceptible d'être nécessaire pour @Override hashCode() et equals(Object) en fonction de votre type (voir: Redéfinition égaux et hashCode en Java )

Autres conseils

Si vous ne passez pas une Comparator explicite à un TreeSet, il va essayer de comparer les objets (en supposant qu'ils sont Comparable). Et si elles ne sont pas Comparable, il ne peut pas les comparer, si cette exception est lancée!
TreeSets sont des jeux triés et nécessitent soit des objets à Comparable ou Comparator à transmettre pour déterminer comment trier les objets du Set.

Si vous voulez juste le jeu pour supprimer les doublons, utilisé un HashSet, bien que cela mélanger l'ordre des objets retournés par la Iterator d'une manière qui apparaissent au hasard.
Mais si vous voulez préserver l'ordre un peu, utilisez LinkedHashSet, qui au moins préserver l'ordre d'insertion de la liste.

TreeSet est approprié que si vous avez besoin de Set triée, soit par la mise en œuvre de l'objet de Comparable ou par un Comparator personnalisé passé au constructeur de TreeSet's.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top