Lors de l'utilisation d'un HashMap, les valeurs et les clés sont-elles garanties dans le même ordre lors de l'itération?

StackOverflow https://stackoverflow.com/questions/128008

  •  02-07-2019
  •  | 
  •  

Question

Quand je parcourrai les valeurs ou les clés, est-ce qu’elles vont se corréler? La seconde clé mappera-t-elle à la seconde valeur?

Était-ce utile?

La solution

Non, pas nécessairement. Vous devriez vraiment utiliser entrySet (). Iterator () à cette fin. Avec cet itérateur, vous parcourrez tous les objets Map.Entry de la carte et pouvez accéder à chaque clé et valeur associée.

Autres conseils

utiliser le entrySet mentionné par @Cuchullain:

Map<String, String> map = new HashMap<String, String>();

// populate hashmap

for (Map.Entry<String, String> entry : map.entrySet()) {
  String key = entry.getKey();
  String value = entry.getValue();
  // your code here
}

Vous souhaitez l'utiliser, LinkedHashMap , pour un ordre d'itération prédicable

public class Test {
 public static void main(String[] args) {
  HashMap <String,String> hashmap = new HashMap<String,String>();
  hashmap.put("one", "1");
  hashmap.put("two", "2");
  hashmap.put("three", "3");
  hashmap.put("four", "4");
  hashmap.put("five", "5");
  hashmap.put("six", "6");

  Iterator <String> keyIterator   = hashmap.keySet().iterator();
  Iterator <String> valueIterator = hashmap.values().iterator();

  while(keyIterator.hasNext()) {
   System.out.println("key: "+keyIterator.next());
  }

  while(valueIterator.hasNext()) {
   System.out.println("value: "+valueIterator.next());
  }
 }
}

key: two
key: five
key: one
key: three
key: four
key: six
value: 2
value: 5
value: 1
value: 3
value: 4
value: 6

Les valeurs () et keySet () sont déléguées à l’itérateur entrySet () afin qu’elles soient renvoyées dans le même ordre. Mais comme Alex dit, il est bien préférable d’utiliser directement l’itérateur entrySet ().

Je suis d'accord avec pmac72. Ne supposez pas que vous obtiendrez des valeurs ou des clés ordonnées à partir d'une collection non ordonnée. Si cela fonctionne de temps en temps, c'est un pur risque. Si vous souhaitez que l’ordre soit préservé, utilisez un LinkedHashMap, un TreeMap ou des collections commons OrderedMap.

La question m'a confondu au début, mais @Matt l'a éclaircie pour moi.

Envisagez d'utiliser la méthode entrySet () qui renvoie un ensemble avec les paires clé-valeur sur la carte.

Map<Integer, Integer> a = new HashMap<Integer, Integer>(2);
a.put(1, 2);
a.put(2, 3);
for (Map.Entry<Integer, Integer> entry : a.entrySet()) {
    System.out.println(entry.getKey() + " => " + entry.getValue());
}

Cette sortie:

1 => 2
2 => 3
3 => 3

Je seconde @basszero. Alors que

for (Map.Entry<Integer, Integer> entry : a.entrySet()) 

fonctionnera, je trouve que l’utilisation d’une structure de données qui le fait automatiquement est plus agréable. Maintenant, vous pouvez simplement itérer "normalement"

La méthode keySet de HashMap renvoie un ensemble qui ne garantit pas l'ordre.
La méthode values ??() de HashMap renvoie une collection qui ne garantit pas l'ordre.

Cela étant dit, la question était "vont-ils mettre en corrélation" donc techniquement, la réponse est peut-être, mais ne comptez pas dessus.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top