Iteración a través de HashMap

Posible duplicado:
¿Cómo clasificar efectivamente cada entrada en el "mapa"?

¿Cuál es la mejor manera de HashMap través de los elementos en un HashMap ?

2987
01 июля '09 в 2:24 2009-07-01 02:24 Burntsugar está programado para el 01 de julio de 2009 a las 2:24.
@ 7 respuestas

entrySet() por entrySet() esta manera:

 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 } } 

Aprenda más sobre el Map .

2954
01 июля '09 в 2:27 2009-07-01 02:27 la respuesta es dada por karim79 01 de julio de 2009 a las 2:27 2009-07-01 02:27

Si solo está interesado en las claves, puede keySet() por keySet() en el mapa:

 Map<String, Object> map = ...; for (String key : map.keySet()) { // ... } 

Si solo necesitas valores, usa values() :

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

Finalmente, si desea una clave y un valor, use entrySet() :

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

Una advertencia: si desea eliminar elementos de iteración media, debe hacerlo a través del iterador (consulte la respuesta karim79 ). Sin embargo, cambiar los valores de los elementos en orden (ver Map.Entry ).

4301
01 июля '09 в 2:28 2009-07-01 02:28 La respuesta es dada por Harto el 1 de julio de 2009 a las 2:28. 2009-07-01 02:28

Extraído del enlace Mapa de iteración en Java :

En Java, hay varias formas de iterar sobre un Map . Veamos los métodos más comunes y consideremos sus ventajas y desventajas. Dado que todos los mapas en Java implementan la interfaz de mapas, los siguientes métodos se utilizarán para cualquier implementación de mapas ( HashMap , TreeMap , LinkedHashMap , Hashtable , etc.)

Método # 1 : Iterar registros utilizando 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 utilizar si necesita claves de mapa y valores en un ciclo.

 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 bucle For-Every se introdujo en Java 5, por lo que este método solo funciona en versiones más nuevas del lenguaje. Además, el bucle For-Each arrojará una NullPointerException si intenta iterar sobre un mapa que es nulo, por lo que siempre debe verificar las referencias nulas antes de iterar.

Método # 2 : Iterar a través de claves o valores utilizando un bucle For-Each.

Si solo necesita claves o valores de un mapa, puede iterar sobre un conjunto de claves o valores en lugar de un inputSet.

 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 tiene una ligera ventaja de rendimiento sobre la iteración entrySet (aproximadamente un 10% más rápido) y más limpio.

Método # 3 : Iteración utilizando Iterador.

Uso de genéricos:

 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 puede usar el mismo método para iterar sobre conjuntos de keySet o valores.

Este método puede parecer redundante, pero tiene sus ventajas. En primer lugar, esta es la única forma de iterar el mapa en versiones anteriores de Java. Otra característica importante es que es el único método que le permite eliminar registros del mapa durante la iteración llamando a iterator.remove() . Si intenta hacer esto durante cada iteración, obtendrá "resultados impredecibles" según Javadoc .

En términos de rendimiento, este método es igual a For-Each Iteration.

Método # 4 : iteración de teclado 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 puede parecer una alternativa más limpia para el método No. 1, pero en la práctica es bastante lento e ineficiente, ya que obtener valores usando la clave puede llevar mucho tiempo (este método es 20% -200% más lento en diferentes implementaciones de Map que en el No. de método). 1). Si tiene instalado FindBugs, detectará esto y le advertirá sobre la iteración inefectiva. Este método debe ser evitado.

Conclusión:

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

770
08 дек. La respuesta se da arvind 08 dic. 2011-12-08 17:19 '11 a las 17:19 2011-12-08 17:19
 for (Map.Entry<String, String> item : params.entrySet()) { String key = item.getKey(); String value = item.getValue(); } 
101
23 июля '11 в 4:28 2011-07-23 04:28 La respuesta es dada por Gabor el 23 de julio de 2011 a las 4:28 2011-07-23 04:28

Puede iterar sobre los registros en un Map varias maneras. Obtenga cada clave y valor de la siguiente manera:

 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 una lista de claves 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 está asociado con las claves, puede utilizar:

 Collection<?> values = map.values(); 
83
01 июля '09 в 2:43 2009-07-01 02:43 la respuesta está dada por codethulhu 01 de julio de 2009 a las 2:43 2009-07-01 02:43

Más inteligente

 for (String key : hashMap.keySet()) { System.out.println("Key: " + key + ", Value: " + map.get(key)); } 
57
11 авг. Respuesta dada por jkarretero 11 ago. 2010-08-11 13:01 '10 a las 13:01 2010-08-11 13:01

Depende Si sabe que necesitará la clave y el valor de cada entrada, vaya a entrySet . Si solo necesita valores, entonces hay un método de values() . Y si solo necesitas llaves, usa keyset() .

Una mala práctica sería map.get(key) través de todas las claves, y luego en un bucle siempre haga un map.get(key) para obtener el valor. Si haces esto, entonces la primera opción que escribí es para ti.

42
01 июля '09 в 2:29 2009-07-01 02:29 Gary Kephart da la respuesta el 1 de julio de 2009 al 2:29 2009-07-01 02:29