2012-09-07 15 views
33

Tengo la siguiente declaración de LinkedHashMap.Cómo iterar a través de LinkedHashMap con listas como valores

LinkedHashMap<String, ArrayList<String>> test1 

my point es cómo puedo iterar a través de este mapa hash. Quiero hacer lo siguiente, para cada clave, obtener la lista de arrays correspondiente e imprimir los valores de la lista de arrays uno por uno contra la clave.

pero yo probamos este llegar solamente devuelve cadena,

String key = iterator.next().toString(); 
ArrayList<String> value = (ArrayList<String>)test1.get(key) 

Respuesta

104
for (Map.Entry<String, ArrayList<String>> entry : test1.entrySet()) { 
    String key = entry.getKey(); 
    ArrayList<String> value = entry.getValue(); 
    // now work with key and value... 
} 

Por cierto, usted debe declarar realmente sus variables como el tipo de interfaz en lugar, como Map<String, List<String>>.

+2

por cierto, quiero tener la lista con el orden de inserción, utilicé HashMap antes, pero perdió el orden. –

+4

No digo que no use 'LinkedHashMap', pero generalmente la mejor práctica es declarar cosas como' Map > map = new LinkedHashMap > '. –

+1

@Pbasak Solo usa el tipo de interfaz para la declaración. Cuando crea una instancia del objeto de mapa, seguirá utilizando su 'LinkedHashMap', lo que asegurará que el orden de inserción permanezca igual. De esta manera, se queda con su elección de implementación pero aún usa el tipo más general para el exterior. –

5

Puede utilizar el conjunto de entradas e iterar sobre las entradas que le permiten acceder tanto a la clave como al valor directamente.

for (Entry<String, ArrayList<String>> entry : test1.entrySet() { 
    System.out.println(entry.getKey() + "/" + entry.getValue()); 
} 

He intentado esto, pero consigue solamente devuelve cadena

¿Por qué piensa así? El método get devuelve el tipo E para el que se eligió el parámetro de tipo genérico, en su caso ArrayList<String>.

7
// iterate over the map 
for(Entry<String, ArrayList<String>> entry : test1.entrySet()){ 
    // iterate over each entry 
    for(String item : entry.getValue()){ 
     // print the map's key with each value in the ArrayList 
     System.out.println(entry.getKey() + ": " + item); 
    } 
} 
+2

Nunca pensé en esto, utilicé foreach en C#, esto es similar a eso. –

11

Supongo que tiene un error ortográfico en su declaración get y que debería ser test1.get (clave). Si es así, no estoy seguro de por qué no está devolviendo una ArrayList a menos que no esté ingresando el tipo correcto en el mapa en primer lugar.

Esto debería funcionar:

// populate the map 
Map<String, List<String>> test1 = new LinkedHashMap<String, List<String>>(); 
test1.put("key1", new ArrayList<String>()); 
test1.put("key2", new ArrayList<String>()); 

// loop over the set using an entry set 
for(Map.Entry<String,List<String>> entry : test1.entrySet()){ 
    String key = entry.getKey(); 
    List<String>value = entry.getValue(); 
    // ... 
} 

o puede utilizar

// second alternative - loop over the keys and get the value per key 
for(String key : test1.keySet()){ 
    List<String>value = test1.get(key); 
    // ... 
} 

Debe utilizar los nombres de interfaz al declarar sus VARs (y en sus parametros genéricos) a menos que tenga una razón muy específica por qué está definiendo usando la implementación.

+0

Hola usé linkhashmap para mantener los elementos en orden de inserción. –

+0

Claro, pero puede especificar LinkedHashMap al crear la instancia. Sin embargo, usar el nombre de la interfaz para la variable le permite hacer que la implementación del código sea independiente. es decir: puede reemplazar fácilmente la implementación con otra cosa en un momento posterior sin necesidad de volver a codificar todo. Vea mi ejemplo anterior para la declaración que usa la interfaz como var, y LinkedHashMap para la implementación. –

2

En Java 8:

Map<String, List<String>> test1 = new LinkedHashMap<String, List<String>>(); 
test1.forEach((key,value) -> { 
    System.out.println(key + " -> " + value); 
}); 
Cuestiones relacionadas