Pregunta Iterar a través de un HashMap [duplicado]


Posible duplicado: 
¿Cómo iterar eficientemente sobre cada entrada en un 'Mapa'?

¿Cuál es la mejor manera de iterar sobre los elementos en una HashMap?


2827
2018-06-30 23:24


origen


Respuestas:


Iterato a través del entrySet() al igual que:

public static void printMap(Map mp) {
    Iterator it = mp.entrySet().iterator();
    while (it.hasNext()) {
        Map.Entry pair = (Map.Entry)it.next();
        System.out.println(pair.getKey() + " = " + pair.getValue());
        it.remove(); // avoids a ConcurrentModificationException
    }
}

Leer más sobre Map.


2835
2018-06-30 23:27



Si solo está interesado en las teclas, puede recorrer el keySet() del mapa:

Map<String, Object> map = ...;

for (String key : map.keySet()) {
    // ...
}

Si solo necesita los valores, use values():

for (Object value : map.values()) {
    // ...
}

Finalmente, si desea tanto la clave como el valor, use entrySet():

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

Una advertencia: si quiere eliminar elementos a mitad de iteración, deberá hacerlo a través de un Iterador (ver La respuesta de karim79) Sin embargo, cambiar los valores de los elementos es correcto (ver Map.Entry)


4119
2018-06-30 23:28



Extraído de la referencia Cómo iterar sobre un mapa en Java:

Hay varias formas de iterar sobre un Map en Java. Repasemos los métodos más comunes y revisemos sus ventajas y desventajas. Dado que todos los mapas en Java implementan la interfaz de Mapa, las siguientes técnicas funcionarán para cualquier implementación de mapa (HashMap, TreeMap, LinkedHashMap, Hashtable, etc.)

Método 1: Iteración sobre las entradas usando un bucle For-Each.

Este es el método más común y es preferible en la mayoría de los casos. Se debe usar si necesita tanto claves de mapa como valores en el bucle.

Map<Integer, Integer> map = new HashMap<Integer, Integer>();
for (Map.Entry<Integer, Integer> entry : map.entrySet()) {
    System.out.println("Key = " + entry.getKey() + ", Value = " + entry.getValue());
}

Tenga en cuenta que el ciclo For-Each se introdujo en Java 5, por lo que este método solo funciona en versiones más nuevas del idioma. También se lanzará un bucle For-Each NullPointerException si intenta iterar sobre un mapa que es nulo, entonces, antes de iterar, siempre debe verificar las referencias nulas.

Método n. ° 2: Iteración sobre claves o valores usando un bucle For-Each.

Si solo necesita claves o valores del mapa, puede iterar sobre keySet o values ​​en lugar de entrySet.

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

// Iterating over keys only
for (Integer key : map.keySet()) {
    System.out.println("Key = " + key);
}

// Iterating over values only
for (Integer value : map.values()) {
    System.out.println("Value = " + value);
}

Este método ofrece una ligera ventaja de rendimiento sobre entrySet iteración (aproximadamente 10% más rápido) y es más limpio.

Método n. ° 3: Iteración usando Iterator.

Usando Generics:

Map<Integer, Integer> map = new HashMap<Integer, Integer>();
Iterator<Map.Entry<Integer, Integer>> entries = map.entrySet().iterator();
while (entries.hasNext()) {
    Map.Entry<Integer, Integer> entry = entries.next();
    System.out.println("Key = " + entry.getKey() + ", Value = " + entry.getValue());
}

Sin genéricos:

Map map = new HashMap();
Iterator entries = map.entrySet().iterator();
while (entries.hasNext()) {
    Map.Entry entry = (Map.Entry) entries.next();
    Integer key = (Integer)entry.getKey();
    Integer value = (Integer)entry.getValue();
    System.out.println("Key = " + key + ", Value = " + value);
}

También puedes usar la misma técnica para iterar keySet o valores

Este método puede parecer redundante, pero tiene sus propias ventajas. En primer lugar, es la única forma de iterar sobre un mapa en versiones anteriores de Java. La otra característica importante es que es el único método que le permite eliminar entradas del mapa durante la iteración llamando iterator.remove(). Si intenta hacer esto durante la iteración For-Each obtendrá "resultados impredecibles" de acuerdo con Javadoc.

Desde el punto de vista del rendimiento, este método es igual a una iteración For-Each.

Método n. ° 4: Iteración sobre claves y búsqueda de valores (ineficiente).

Map<Integer, Integer> map = new HashMap<Integer, Integer>();
for (Integer key : map.keySet()) {
    Integer value = map.get(key);
    System.out.println("Key = " + key + ", Value = " + value);
}

Esto podría parecer una alternativa más limpia para el método n.º 1, pero en la práctica es bastante lento e ineficaz ya que obtener valores con una clave puede consumir mucho tiempo (este método en diferentes implementaciones de mapas es 20% -200% más lento que el método n.º 1 ) Si tiene FindBugs instalado, lo detectará y le advertirá sobre la iteración ineficiente. Este método debe ser evitado.

Conclusión:

Si solo necesita claves o valores del mapa, use el método n. ° 2. Si está atascado con una versión anterior de Java (menos de 5) o planea eliminar entradas durante la iteración, debe usar el método n. ° 3. De lo contrario, use el método n. ° 1.


739
2017-12-08 14:19



Puede repetir las entradas en un Map de varias maneras. Obtenga cada clave y valor así:

Map<?,?> map = new HashMap<Object, Object>();
for(Entry<?, ?> e: map.entrySet()){
    System.out.println("Key " + e.getKey());
    System.out.println("Value " + e.getValue());
}

O puede obtener la lista de llaves con

Collection<?> keys = map.keySet();
for(Object key: keys){
    System.out.println("Key " + key);
    System.out.println("Value " + map.get(key));
}

Si solo desea obtener todos los valores y no se preocupan por las claves, puede usar:

Collection<?> values = map.values();

77
2018-06-30 23:43



for (Map.Entry<String, String> item : params.entrySet()) {
    String key = item.getKey();
    String value = item.getValue();
}

70
2017-07-23 01:28



Más inteligente

for (String key : hashMap.keySet()) {
    System.out.println("Key: " + key + ", Value: " + map.get(key));
}

55
2017-08-11 10:01



Depende Si sabes que vas a necesitar tanto la clave como el valor de cada entrada, entonces revisa el entrySet. Si solo necesitas los valores, entonces está el values() método. Y si solo necesitas las llaves, entonces usa keyset().

Una mala práctica sería iterar a través de todas las teclas, y luego dentro del ciclo, siempre hacer map.get(key) para obtener el valor Si estás haciendo eso, entonces la primera opción que escribí es para ti.


40
2018-06-30 23:29