180 votes

L'ordre est-il garanti pour le retour des clés et des valeurs d'un objet LinkedHashMap ?

Je sais. LinkedHashMap a un ordre d'itération prévisible (ordre d'insertion). Est-ce que le Set retourné par LinkedHashMap.keySet() y el Collection retourné par LinkedHashMap.values() maintiennent également cet ordre ?

1 votes

Puisque toutes les réponses abordent la question de values() ainsi que keySet() J'ai élargi la question pour l'inclure. Cela signifie que d'autres questions peuvent être fermées en tant que doublons de celle-ci.

245voto

Powerlord Points 43989

L'interface Map fournit trois vues de la collection qui permettent de considérer le contenu d'une carte comme un ensemble de clés, une collection de valeurs ou un ensemble de mappages clé-valeur. Le site commander de une carte est définie comme l'ordre dans lequel les itérateurs des vues de la collection de la carte de la carte retournent leurs éléments. Certaines implémentations comme l'implémentation TreeMap des garanties spécifiques quant à leur ordre. leur ordre ; d'autres, comme le HashMap classe, ne le faites pas.

-- Carte

Cette liste liée définit l'ordre d'itération qui est normalement l'ordre dans lequel dans lequel les clés ont été insérées dans la carte ( ordre d'insertion ).

-- Cartouche de hachage

Donc, oui, keySet() , values() y entrySet() (les trois vues de collection mentionnées) renvoient les valeurs dans l'ordre utilisé par la liste chaînée interne. Et oui, la JavaDoc de Map y LinkedHashMap le garantir.

C'est le but de ce cours, après tout.

10 votes

L'itération sur la carte se fait également plus rapidement en utilisant un LinkedHashMap qu'un HashMap.

0 votes

@Thierry : Oui, j'aurais dû le mentionner. Oups.

2 votes

Values() renvoie une collection. pas une liste. comment la garder en ordre ?

12voto

sblundy Points 27163

En regardant la source, on dirait que c'est le cas. keySet() , values() y entrySet() utilisent tous le même itérateur d'entrée en interne.

1 votes

Ce serait cool d'avoir un lien vers les dépôts, mais je suis paresseux :-) et bien sûr, ce n'est pas une garantie de compatibilité future.

5voto

EJP Points 113412

Vous pouvez le supposer. La Javadoc indique "ordre d'itération prévisible", et les seuls itérateurs disponibles dans une Map son celles pour les fonctions keySet(), entrySet() et values().

Ainsi, en l'absence de toute autre qualification, il est clairement destiné à s'appliquer à tous ces itérateurs.

0voto

Uri Points 50687

AFAIK, ce n'est pas documenté, donc vous ne pouvez pas le supposer "formellement". Il est toutefois peu probable que l'implémentation actuelle soit modifiée.

Si vous voulez garantir l'ordre, vous pouvez itérer sur les entiers de la carte et les insérer dans un ensemble trié avec une fonction d'ordre de votre choix, bien que vous deviez payer un coût de performance, naturellement.

0 votes

Voulez-vous dire que entrySet() garantit l'ordre, par keySet() ne le fait pas ?

1 votes

@kknight : Je ne suis pas sûr. La javadoc indique : "Cette liste liée définit l'ordre d'itération, qui est normalement l'ordre dans lequel les clés ont été insérées dans la carte (insertion-order)". Cependant, les javadocs du JDK sont très ambiguës en général.

5 votes

Si même entrySet() ne garantit pas l'ordre d'itération, alors quelle est la différence entre LinkedHashMap et HashMap ? Comment pouvons-nous tirer parti de l'ordre d'itération prévisible dans une instance de LinkedHashMap ?

-3voto

extraneon Points 13362

En regardant l'interface, elle renvoie un simple Set et non un SortedSet . Il n'y a donc aucune garantie.

Avant de supposer une garantie implicite en regardant l'implémentation (toujours une mauvaise idée), regardez aussi les implémentations dans toutes les autres implémentations Java :)

Vous pourriez mieux créer par exemple un TreeSet avec le keySet dans le constructeur.

4 votes

En regardant de plus près la documentation, il y a effectivement des garanties. Comme quelqu'un l'a déjà écrit, c'est le but même de cette classe.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X