Liste à la conversion TreeSet produit: « java.lang.ClassCastException: MyClass ne peut pas être jeté à java.lang.Comparable »
-
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.
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
impliquex.compareTo(z)>0
-
x.compareTo(y)==0
implique quesgn(x.compareTo(z)) == sgn(y.compareTo(z))
pour tousz
En outre, il recommande que:
-
(x.compareTo(y)==0) == (x.equals(y))
, à savoir « compatible avecequals
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
.