web-dev-qa-db-fra.com

commander un exemple de hachage?

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?

20
Jony

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().

Voir également:

45
BalusC

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.

8
trashgod

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!)

1
Gian