Java Jeu de conserver l'ordre?

est-ce un Jeu Java conserver l'ordre? Une méthode me renvoie un ensemble et supposément les données sont ordonnées mais en itérant sur L'ensemble, les données ne sont pas ordonnées. Est-il une meilleure façon de gérer cela? Est-ce que la méthode doit être changée pour retourner autre chose qu'un ensemble?

109
demandé sur user840930 2012-05-25 14:27:01

12 réponses

l'interface Set ne fournit aucune garantie de commande.

sa sous-interface SortedSet représente un ensemble qui est trié selon un critère quelconque. En Java 6, Il existe deux conteneurs standards qui implémentent SortedSet . Il s'agit de TreeSet et ConcurrentSkipListSet .

en plus du SortedSet interface, il y a aussi 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.

165
répondu NPE 2018-09-23 09:56:16

LinkedHashSet est ce dont vous avez besoin.

62
répondu xiaofeng.li 2016-05-13 18:15:09

comme plusieurs membres ont suggéré d'utiliser LinkedHashSet pour conserver l'ordre de la collection. U peut envelopper votre ensemble en utilisant cette implémentation.

SortedSet l'implémentation peut être utilisée pour l'ordre trié mais pour votre usage, utilisez LinkedHashSet .

Également de la documentation,

" cette mise en œuvre épargne ses clients de la non spécifiée, généralement commande chaotique fournie par HashSet, sans encourir le coût accru associé à TreeSet. Il peut être utilisé pour produire une copie d'un jeu qui a le même ordre que l'original, indépendamment de la mise en œuvre de l'ensemble original: "

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

11
répondu Lakshman 2017-11-24 18:23:26

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 envelopper votre Set de cette façon:

Set myOrderedSet = new LinkedHashSet(mySet);
8
répondu javatutorial 2012-05-25 10:29:45

pour conserver la commande Utiliser List ou un LinkedHashSet .

7
répondu JHS 2012-05-25 10:53:31

De la javadoc de Set.iterator() :

Retourne un itérateur sur les éléments de cet ensemble. Les éléments ne sont retournés dans aucun ordre particulier (sauf si cet ensemble est une instance d'une certaine classe qui fournit une garantie).

et, comme déjà indiqué par shuuuchan , un TreeSet est une mise en œuvre de Set qui a une commande garantie:

Les éléments sont ordonnés en utilisant leur ordre naturel, ou par un comparateur fourni au temps de création défini, en fonction du constructeur utilisé.

3
répondu hmjd 2017-05-23 11:47:26

Normalement ne pas maintenir l'ordre, comme HashSet afin de trouver rapidement une emelent, mais vous pouvez essayer LinkedHashSet il va garder l'ordre que vous mettez dans.

3
répondu user1335794 2012-05-25 10:30:44

voici un résumé rapide des caractéristiques d'ordre de la norme Set implémentations disponibles en Java:

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

pour votre cas spécifique, vous pouvez soit trier les articles d'abord et ensuite utiliser l'un ou l'autre de 1 ou 2 (très probablement LinkedHashSet ou TreeSet ). Ou alternativement et plus efficacement , vous pouvez simplement ajouter des données non triées à un TreeSet qui prendra soin du tri automatiquement pour vous.

3
répondu assylias 2012-05-25 10:41:18

un HashSet linked est une version commandée du HashSet qui maintient une liste doublement liée à travers tous les éléments. Utilisez cette classe au lieu du HashSet lorsque vous vous souciez de l'ordre d'itération.

1
répondu Danail Tsvetanov 2018-04-04 11:58:12

L'interface Set elle-même ne spécifie aucun ordre particulier. Le SortedSet cependant.

0
répondu Jens Borgland 2012-05-25 10:30:58

Iterator retourné par Set n'est pas supposé retourner les données de manière ordonnée. Voir ce deux java.util.Les itérateurs de la même collection: - ils à retourner des éléments dans le même ordre?

0
répondu ejb_guy 2017-05-23 12:10:43

seulement SortedSet peut faire l'ordre du Set

-1
répondu 2012-05-25 10:33:15