Cuando se utiliza un HashMap, ¿se garantiza que los valores y las claves están en el mismo orden al iterar?

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

  •  02-07-2019
  •  | 
  •  

Pregunta

Cuando itero sobre los valores o claves, ¿van a correlacionarse? ¿Se asignará la segunda clave al segundo valor?

¿Fue útil?

Solución

No, no necesariamente. Deberías usar realmente el entrySet (). Iterator () para este propósito. Con este iterador, recorrerá todos los objetos Map.Entry en el mapa y podrá acceder a cada clave y valor asociado.

Otros consejos

para usar el entrySet que mencionó @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
}

Desea utilizar esto, LinkedHashMap , para orden de iteración predecible

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

Ambos valores () y keySet () se delegan en el iterador entrySet () para que se devuelvan en el mismo orden. Pero como dice Alex, es mucho mejor usar el iterador entrySet () directamente.

Estoy de acuerdo con pmac72. No asuma que obtendrá valores ordenados o claves de una colección desordenada. Si funciona de vez en cuando es solo un peligro. Si desea que se conserve el orden, use un LinkedHashMap o un TreeMap o commons colecciones OrderedMap.

La pregunta me confundió al principio, pero @Matt me lo aclaró.

Considere usar el método entrySet () que devuelve un conjunto con los pares clave-valor en el mapa.

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());
}

Esto produce:

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

Segundo @basszero. Mientras

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

funcionará, me parece que usar una estructura de datos que hace esto automáticamente es mejor. Ahora, simplemente puede iterar " normalmente "

El método keySet de HashMap devuelve un conjunto, que no garantiza el orden.
El método values ??() de HashMap devuelve una Colección, que no garantiza el orden.

Dicho esto, la pregunta era "se van a correlacionar" así que técnicamente la respuesta es tal vez, pero no confíe en ella.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top