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)
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
Utilisez ensuite un HashSet. Il n'essaie pas de trier les éléments. –