web-dev-qa-db-fra.com

Java Définir l'ordre de maintien?

Un Java Set conserve-t-il l'ordre? Une méthode me renvoie un ensemble et soi-disant, les données sont ordonnées, mais en effectuant une itération sur l'ensemble, les données ne sont pas ordonnées. Y a-t-il une meilleure façon de gérer cela? La méthode doit-elle être modifiée pour renvoyer autre chose qu'un ensemble?

149
user840930

L’interface Set ne fournit aucune garantie de commande.

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

Outre 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.

215
NPE

LinkedHashSet est ce dont vous avez besoin.

86
xiaofeng.li

Comme de nombreux membres ont suggéré d'utiliser LinkedHashSet pour conserver l'ordre de la collection. Vous pouvez envelopper votre ensemble en utilisant cette implémentation.

L’implémentation SortedSet peut être utilisée pour un ordre trié mais pour votre utilisation, utilisez LinkedHashSet .

Aussi de la documentation,

"Cette implémentation épargne à ses clients des commandes non spécifiées, généralement chaotiques, fournies par HashSet, sans entraîner de coût supplémentaire associé à TreeSet. la mise en œuvre de l'ensemble: "

Source: http://docs.Oracle.com/javase/6/docs/api/Java/util/LinkedHashSet.html

15
Lakshman

Set est juste une interface. Afin de 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 envelopper votre Set de cette façon:

Set myOrderedSet = new LinkedHashSet(mySet);
8
javatutorial

Pour conserver la commande, utilisez List ou LinkedHashSet.

7
JHS

Voici un résumé rapide des caractéristiques d’ordre des implémentations standard Set disponibles en Java:

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

Dans votre cas particulier, vous pouvez trier les éléments d’abord puis utiliser l’un des 1 ou 2 (le plus probable est LinkedHashSet ou TreeSet). Ou bien et plus efficacement , vous pouvez simplement ajouter des données non triées à un TreeSet qui se chargera automatiquement du tri pour vous.

6
assylias

LinkedHashSet est une version ordonnée de HashSet qui gère une liste doublement chaînée entre tous les éléments. Utilisez cette classe au lieu de HashSet lorsque vous vous souciez de l'ordre des itérations.

4
Danail Tsvetanov

Depuis le javadoc pour Set.iterator():

Renvoie un itérateur sur les éléments de cet ensemble. Les éléments sont retournés sans ordre particulier (à moins que cet ensemble ne soit 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 en utilisant leur ordre naturel ou à l'aide d'un comparateur fourni au moment de la création, en fonction du constructeur utilisé.

3
hmjd

Normalement, set ne conserve pas l'ordre, tel que HashSet, afin de trouver rapidement un émelent, mais vous pouvez essayer LinkedHashSet pour qu'il conserve l'ordre que vous avez mis.

3
user1335794

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

0
Jens Borgland

L'itérateur renvoyé par Set n'est pas censé renvoyer des données de manière ordonnée. Voir ceci Deux Java.util.Iterators à la même collection: doivent-ils retourner des éléments dans le même ordre?

0
ejb_guy