Java Set conserve l’ordre?

Un ensemble Java conserve-t-il l’ordre? Une méthode me renvoie un ensemble et les données sont supposées être ordonnées mais itérées sur l’ensemble, les données ne sont pas ordonnées. Y a-t-il un meilleur moyen de gérer cela? La méthode doit-elle être modifiée pour renvoyer autre chose qu’un ensemble?

L’interface Set ne fournit aucune garantie de classement.

Sa sous-interface, SortedSet , représente un ensemble sortingé selon certains critères. Dans Java 6, deux conteneurs standard implémentent SortedSet . Ils sont TreeSet et ConcurrentSkipListSet .

En plus de l’interface SortedSet , il existe également la classe LinkedHashSet . Il se souvient de l’ordre dans lequel les éléments ont été insérés dans l’ensemble et renvoie ses éléments dans cet ordre.

LinkedHashSet est ce dont vous avez besoin.

Comme beaucoup de membres suggèrent d’utiliser LinkedHashSet pour conserver l’ordre de la collection. Vous pouvez envelopper votre ensemble en utilisant cette implémentation.

L’ implémentation de SortedSet peut être utilisée pour un ordre sortingé, mais pour cela, utilisez LinkedHashSet .

Aussi des documents,

“Cette implémentation épargne à ses clients les commandes non spécifiées, généralement chaotiques, fournies par HashSet, sans encourir le coût accru associé à TreeSet. Elle peut être utilisée pour produire une copie d’un ensemble ayant le même ordre que l’original, quel que soit l’original. mise en œuvre de l’ensemble: ”

Source: http://docs.oracle.com/javase/6/docs/api/java/util/LinkedHashSet.html

Set est juste une interface. Pour conserver l’ordre, vous devez utiliser une implémentation spécifique de cette interface et de la sous-interface SortedSet, par exemple TreeSet ou LinkedHashSet. Vous pouvez emballer votre Set de cette façon:

 Set myOrderedSet = new LinkedHashSet(mySet); 

Pour conserver la commande, utilisez List ou un LinkedHashSet .

Depuis le javadoc pour Set.iterator() :

Renvoie un iterator sur les éléments de cet ensemble. Les éléments sont renvoyés sans ordre particulier (sauf si cet ensemble est une instance d’une classe fournissant une garantie).

Et, comme déjà indiqué par shuuchan , un TreeSet est une implémentation de Set qui a un ordre garanti:

Les éléments sont classés selon leur ordre naturel ou par un comparateur fourni au moment de la création de l’ensemble, en fonction du constructeur utilisé.

Normalement, set ne conserve pas la commande, comme HashSet afin de trouver rapidement un emelent, mais vous pouvez essayer LinkedHashSet, il gardera l’ordre que vous avez mis.

Voici un résumé rapide des caractéristiques de commande des implémentations Set standard disponibles en Java:

  1. conserver l’ordre d’insertion: LinkedHashSet et CopyOnWriteArraySet (thread-safe)
  2. conserver les éléments sortingés dans l’ensemble: TreeSet , EnumSet (spécifique aux enums) et ConcurrentSkipListSet (thread-safe)
  3. ne conserve pas les articles dans un ordre spécifique: HashSet (celui que vous avez essayé)

Pour votre cas spécifique, vous pouvez d’abord sortinger les éléments, puis utiliser l’un des éléments 1 ou 2 (probablement LinkedHashSet ou TreeSet ). Ou bien et plus efficacement , vous pouvez simplement append des données non sortingées à un TreeSet qui s’occupera automatiquement du sorting pour vous.

Un LinkedHashSet est une version ordonnée de HashSet qui gère une liste à double lien sur tous les éléments. Utilisez cette classe à la place de HashSet lorsque vous vous souciez de l’ordre d’itération.

L’interface Set elle-même ne stipule aucun ordre particulier. Le SortedSet fait cependant.

Iterator renvoyé par Set n’est pas censé renvoyer les données de manière ordonnée. Voir ceci Deux java.util.Iterators pour la même collection: doivent-ils renvoyer des éléments dans le même ordre?

Seul SortedSet peut effectuer la commande de l’ Set