2010-10-19 44 views
21

estoy tratando de utilizar un HashMap para mapear una cadena única a un ArrayList cadena como esta:Java HashMap: ¿Cómo obtener una clave y valor por índice?

HashMap<String, ArrayList<String>> 

Básicamente, quiero ser capaz de acceder a las claves por número, no utilizando el nombre de la clave. Y quiero poder acceder al valor de dicha clave para iterar sobre ella. Imagino algo como esto:

for(all keys in my hashmap) { 
    for(int i=0; i < myhashmap.currentKey.getValue.size(); i++) { 
     // do things with the hashmaps elements 
    } 
} 

¿Hay una manera fácil de hacerlo?

+0

si quieres "sólo" el primer elemento, ver http://stackoverflow.com/a/1936472/32453 – rogerdpack

Respuesta

26

puede iterar sobre las claves llamando map.keySet(), o iterar sobre las entradas llamando map.entrySet(). Iterar las entradas probablemente sea más rápido.

for (Map.Entry<String, List<String>> entry : map.entrySet()) { 
    List<String> list = entry.getValue(); 
    // Do things with the list 
} 

Si desea asegurarse de que iterar sobre las claves en el mismo orden que insertó a continuación, utilizar un LinkedHashMap.

Por cierto, recomendaría cambiar el tipo declarado del mapa a <String, List<String>>. Siempre es mejor declarar los tipos en términos de la interfaz en lugar de la implementación.

+0

¡¡¡buena respuesta !!! me ganaste :) – JJunior

7

Los HashMaps no están ordenados, a menos que use un LinkedHashMap o SortedMap. En este caso, es posible que desee un LinkedHashMap. Esto se repetirá en el orden de inserción (o en el orden de último acceso, si lo prefiere). En este caso, sería

int index = 0; 
for (Map.Entry<String,ArrayList<String>> e : myHashMap.iterator().entrySet()) { 
    String key = e.getKey(); 
    ArrayList<String> val = e.getValue(); 
    index++; 
} 

No hay get directa (índice) en un mapa, ya que es una lista desordenada de pares clave/valor. LinkedHashMap es un caso especial que mantiene el orden.

1

que puede hacer:

for(String key: hashMap.keySet()){ 
    for(String value: hashMap.get(key)) { 
     // use the value here 
    } 
} 

Esto iterar sobre cada llave, y luego cada valor de la lista asociada a cada tecla.

+0

Gracias a todos los que respondieron Jjnguy, esto es exactamente lo que quería. Tú también, kkress. – Derek

+0

@derek, me alegro de poder ayudar. – jjnguy

0

Los HashMaps no mantienen sus pares clave/valor en un orden específico. Se ordenan en función del hash que devuelve cada clave de su método Object.hashCode(). Sin embargo, puede iterar sobre el conjunto de pares clave/valor utilizando un iterador con:

for (String key : hashmap.keySet()) 
{ 
    for (list : hashmap.get(key)) 
    { 
     //list.toString() 
    } 
} 
2
for (Object key : data.keySet()) { 
    String lKey = (String) key; 
    List<String> list = data.get(key); 
} 
52

Aquí es la solución general si realmente solo deseas valor de la primera de clave

Object firstKey = myHashMap.keySet().toArray()[0]; 
Object valueForFirstKey = myHashMap.get(firstKey); 
+6

bueno para ser muy estricto ... el OP pidió el * valor *, no la * tecla *. Por lo tanto, es posible que desee agregar 'Object myValue = myMap.get (myKey);' – avalancha

+0

No estoy seguro de que la sobrecarga (potencial) de 'toArray()' supere el 'iterator(). Next()' ... – Matthieu

0

Si no se preocupan por la clave real, de manera concisa para iterar sobre todo los valores de la Ruta sería utilizar su método values()

Map<String, List<String>> myMap; 

for (List<String> stringList : myMap.values()) { 
    for (String myString : stringList) { 
     // process the string here 
    } 
} 

laEl métodoes parte de la interfaz del Mapa y devuelve una vista de Colección de los valores en el mapa.

0

Ya se ha seleccionado una solución.Sin embargo, he puesto esta solución para aquellos que quieran utilizar un enfoque alternativo:

// use LinkedHashMap if you want to read values from the hashmap in the same order as you put them into it 
LinkedHashMap <String, ArrayList<String>> myhashmap = new LinkedHashMap <String, ArrayList<String>>(); 

// fill myhashmap ... 

// get the first value (arraylist) from the hashmap 
Map.Entry<String, ArrayList<String>> entry = (Map.Entry<String, ArrayList<String>>) myhashmap.entrySet().toArray()[0]; 
ArrayList<String> arrayList = entry.getValue(); 
Cuestiones relacionadas