J'ai besoin d'un exemple sur la façon d'utiliser une classe comparable sur un HashSet
pour obtenir un ordre croissant. Disons que j'ai un HashSet
comme celui-ci:
HashSet<String> hs = new HashSet<String>();
Comment puis-je faire en sorte que hs
soit dans l'ordre croissant?
Utilisez plutôt TreeSet
. Il a un constructeur prenant un Comparator
. Il triera automatiquement les Set
.
Si vous souhaitez convertir un HashSet
en un TreeSet
, procédez comme suit:
Set<YourObject> hashSet = getItSomehow();
Set<YourObject> treeSet = new TreeSet<YourObject>(new YourComparator());
treeSet.addAll(hashSet);
// Now it's sorted based on the logic as implemented in YourComparator.
Si les éléments que vous avez lui-même implémentent déjà Comparable
et que son ordre de tri par défaut est déjà ce que vous voulez, alors vous n'avez fondamentalement pas besoin de fournir un Comparator
. Vous pouvez alors construire le TreeSet
directement basé sur le HashSet
. Par exemple.
Set<String> hashSet = getItSomehow();
Set<String> treeSet = new TreeSet<String>(hashSet);
// Now it's sorted based on the logic as implemented in String#compareTo().
HashSet
"ne donne aucune garantie quant à l'ordre d'itération de l'ensemble." Utilisez plutôt LinkedHashSet
.
Addendum: Je voudrais appuyer le point de @ BalusC sur l'implémentation de Comparable
et exprimer une légère préférence pour LinkedHashSet
, qui offre un "ordre d'itération prévisible. .. sans encourir le coût accru associé à TreeSet
. "
Addendum: @Stephen soulève un point important, qui favorise la suggestion de @ BalusC de TreeMap
. LinkedHashSet
n'est une alternative plus efficace que si les données sont (presque) statiques et déjà triées.
HashSets ne garantit pas l'ordre d'itération :
Cette classe implémente l'interface Set, soutenue par une table de hachage (en fait une instance HashMap). Il ne donne aucune garantie quant à l'ordre d'itération de l'ensemble; en particulier, il ne garantit pas que l'ordre restera constant dans le temps. Cette classe autorise l'élément nul.
Vous devez probablement choisir ne structure de données différente si vous voulez pouvoir contrôler l'ordre d'itération (ou en avoir une du tout!)