Un ensemble Java conserve-t-il l'ordre? Une méthode me renvoie un ensemble et, supposément, les données sont ordonnées mais en 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?
179
Réponses:
L'
Set
interface ne fournit aucune garantie de commande.Sa sous-interface
SortedSet
représente un ensemble qui est trié selon un critère. Dans Java 6, il existe deux conteneurs standard qui implémententSortedSet
. Ils sontTreeSet
etConcurrentSkipListSet
.En plus de l'
SortedSet
interface, il y a aussi laLinkedHashSet
classe. 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.la source
LinkedHashSet est ce dont vous avez besoin.
la source
List
n'est pas unSet
(il ne garantit pas l'unicité de l'appartenance).Comme beaucoup de membres l'ont suggéré, utilisez 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 l'ordre trié, mais à vos fins, utilisez LinkedHashSet .
Également à partir de la documentation,
"Cette implémentation évite à ses clients la commande non spécifiée et généralement chaotique fournie par HashSet, sans entraîner le coût accru associé à TreeSet. Elle peut être utilisée pour produire une copie d'un ensemble qui a le même ordre que l'original, quel que soit l'original implémentation de l'ensemble: "
Source: http://docs.oracle.com/javase/6/docs/api/java/util/LinkedHashSet.html
la source
L'ensemble n'est qu'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 ensemble de cette façon:
la source
Voici un résumé rapide des caractéristiques d'ordre des
Set
implémentations standard disponibles en Java:Pour votre cas spécifique, vous pouvez d'abord trier les éléments, puis utiliser l'un des 1 ou 2 (très probablement
LinkedHashSet
ouTreeSet
). Ou encore et plus efficacement , vous pouvez simplement ajouter des données non triées à unTreeSet
qui se chargera du tri automatiquement pour vous.la source
Pour conserver la commande, utilisez
List
ou aLinkedHashSet
.la source
LinkedHashSet
, non ...Map
.Un LinkedHashSet est une version ordonnée de HashSet qui maintient une liste doublement liée à travers tous les éléments. Utilisez cette classe au lieu de HashSet lorsque vous vous souciez de l'ordre d'itération.
la source
Depuis le javadoc pour
Set.iterator()
:Et, comme déjà indiqué par shuuchan , a
TreeSet
est une implémentation deSet
qui a un ordre garanti:la source
Normalement, set ne garde pas l'ordre, tel que HashSet afin de trouver rapidement un emelent, mais vous pouvez essayer LinkedHashSet il conservera l'ordre que vous avez mis.
la source
Il y a 2 choses différentes.
la source
L'interface Set elle-même ne stipule aucun ordre particulier. Le SortedSet le fait cependant.
la source
L'itérateur renvoyé par Set n'est pas supposé renvoyer les données de manière ordonnée. Voir ceci Deux java.util.Iterators dans la même collection: doivent-ils renvoyer des éléments dans le même ordre?
la source
Seul
SortedSet
peut faire la commande duSet
la source