La conversion de la liste en TreeSet produit: "java.lang.ClassCastException: MyClass ne peut pas être converti en java.lang.Comparable"
List<MyClass> myclassList = (List<MyClass>) rs.get();
TreeSet<MyClass> myclassSet = new TreeSet<MyClass>(myclassList);
Je ne comprends pas pourquoi ce code donne ceci:
java.lang.ClassCastException: MyClass cannot be cast to java.lang.Comparable
MyClass ne pas mettre en œuvre Comparable. Je veux juste utiliser un Ensemble de filtrer les éléments de la Liste depuis ma Liste contient unncessary les doublons.
source d'informationauteur Chuck
Vous devez vous connecter pour publier un commentaire.
Ne
MyClass implements Comparable<MyClass>
ou quelque chose comme ça?Si non, alors c'est pourquoi.
Pour
TreeSet
soit vous devez faire les élémentsComparable
ou de fournir uneComparator
. SinonTreeSet
ne peut pas fonctionner, car il ne serait pas savoir comment commander les éléments.Rappelez-vous,
TreeMap implements SortedSet
donc c'est pour savoir comment commanderles éléments d'une façon ou d'une autre.
Vous devriez vous familiariser avec la façon dont la mise en œuvre de
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, zéro ou un entier positif si cet objet est inférieur, égal ou plus grand que l'autre objet, respectivement.Le contrat nécessite que:
sgn(x.compareTo(y)) == -sgn(y.compareTo(x))
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))
c'est à dire "compatible avecequals
Cela peut sembler beaucoup à digérer au début, mais c'est vraiment tout à fait naturel avec
la manière dont on définit le total de la commande.
Si vos objets ne peut pas être commandé d'une manière ou d'une autre, puis une
TreeSet
n'aurait pas de sens. Vous souhaiterez peut-être utiliser unHashSet
au lieu, qui ont ses propres contrats. Vous êtes susceptibles d'être requis pour@Override hashCode()
etequals(Object)
en fonction de votre type (voir: Primordial equals et hashCode en Java)Si vous ne passez pas explicite
Comparator
à unTreeSet
il va essayer de comparer les objets (en supposant qu'ils sontComparable
). Et si elles ne sont pasComparable
il ne peut pas les comparer, de sorte que cette exception est levée!TreeSets
sont ensembles classés et nécessitent soit des objets àComparable
ou unComparator
être adoptées pour déterminer la façon de trier les objets dans leSet
.Si vous voulez juste l'ensemble de supprimer les doublons, utilisé une
HashSet
bien que ce mélange l'ordre des objets retournés par laIterator
dans des voies qui semblent aléatoires.Mais si vous voulez conserver l'ordre quelque peu, l'utilisation
LinkedHashSet
, qui permettra au moins de préserver l'ordre d'insertion de la liste.TreeSet
est appropriée si vous avez besoin de laSet
triées, soit par l'Objet de la mise en œuvre deComparable
ou par une coutumeComparator
passé à laTreeSet's
constructeur.