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?
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.
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
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);
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é.
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.
voici un résumé rapide des caractéristiques d'ordre de la norme Set
implémentations disponibles en Java:
- garder l'ordre d'insertion: LinkedHashSet et CopyOnWriteArraySet (thread-safe)
- garder les articles triés dans l'ensemble: TreeSet , EnumSet (spécifique à enums) et concurrence Kiplistset (thread-safe)
- 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.
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.
L'interface Set elle-même ne spécifie aucun ordre particulier. Le SortedSet cependant.
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?