2010-03-24 4 views
11
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:à la conversion TreeSet produit: "java.lang.ClassCastException: MyClass ne peut pas être jeté à java.lang.Comparable"

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

MyClass fait pas mettre en œuvre comparable. Je veux juste utiliser un ensemble pour filtrer les éléments uniques de la liste puisque ma liste contient des doublons inutiles.

Répondre

18

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

Si non, alors c'est pourquoi.

Pour TreeSet, vous devez soit créer les éléments Comparable, soit fournir un Comparator. Sinon, TreeSet ne peut pas fonctionner car il ne sait pas comment commander les éléments. Rappelez-vous, TreeMap implements SortedSet, donc il faut savoir commander les éléments d'une manière ou d'une 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 renvoyer un entier négatif, zéro ou un entier positif si cet objet est inférieur, égal ou supérieur à l'autre objet respectivement.

Le contrat exige 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

De plus, 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 avec 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 une TreeSet ne serait pas logique. Vous pouvez utiliser un HashSet à la place, qui a ses propres contrats. Vous êtes susceptible d'être nécessaire pour @Override hashCode() et equals(Object) en fonction de votre type (voir: Overriding equals and hashCode in Java)

+0

MyClass n'implémente pas Comparable. Je veux juste utiliser un ensemble pour filtrer les éléments uniques de la liste puisque ma liste contient des doublons inutiles. – Chuck

+2

Utilisez ensuite un HashSet. Il n'essaie pas de trier les éléments. –

2

Si vous ne passez pas un Comparator explicite à un TreeSet, il essaiera de comparer les objets (en supposant qu'ils sont Comparable). Et s'ils ne sont pas Comparable, il ne peut pas les comparer, donc cette exception est levée!
TreeSets sont des ensembles triés et nécessitent que les objets soient Comparable ou qu'un Comparator soit transmis pour déterminer comment trier les objets dans Set.

1

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

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

Questions connexes