2010-04-21 13 views
34

En java si estoy recorriendo el keySet() de un HashMap, ¿cómo puedo (dentro del ciclo) obtener el índice numérico de esa clave?Java: ¿obtiene el índice de clave en HashMap?

Básicamente, cuando recorro el mapa, quiero obtener 0,1,2 ... Me imagino que esto sería más limpio que declarar un int e incrementar con cada iteración.

Gracias.

+3

¿Para qué lo necesitas? Como se menciona en las respuestas, el orden en un mapa no es necesariamente constante, puede cambiar cuando las claves se agregan o eliminan. – extraneon

+5

Lo que es aún mejor es que dos HashMaps que son iguales aún pueden tener diferentes ordenamientos. Pueden hacerlo * incluso si tienen el mismo historial de adds/quita * (diferentes capacidades lo harían). –

+0

http://stackoverflow.com/questions/18188739/arraylist-of-hashmap-or-linkedhashmap-to-get-item-by-index/18959271#18959271 –

Respuesta

4

En pocas palabras, las colecciones basadas en hash no están indexadas, por lo que debe hacerlo manualmente.

+0

¿Cuál es la estructura de datos recomendada en este caso? –

18

El HashMap no tiene un orden definido de claves.

8

No se puede - un conjunto no está ordenado, por lo que no se proporciona ningún índice. Tendrás que declarar un int, como dices. Recuerde que la próxima vez que llame a keySet() no necesariamente obtendrá los resultados en el mismo orden.

+1

Si el OP realmente * quiere * esto, no es difícil escribir una colección respaldada por un TreeSet y un mapa. De esa forma puedes obtener los resultados siempre en el mismo orden.Ahora, en cuanto a cómo comportarse cuando se modifica el Mapa durante la iteración, depende del OP, pero una estructura de datos que es un mapa donde las claves están en un conjunto ordenado es definitivamente factible. (Por cierto, estoy comentando más sobre su respuesta que sobre la pregunta del OP). – SyntaxT3rr0r

36

No estoy seguro si esto es cualquier "más limpia", pero:

List keys = new ArrayList(map.keySet()); 
for (int i = 0; i < keys.size(); i++) { 
    Object obj = keys.get(i); 
    // do stuff here 
} 
+1

O similarmente: 'int index = 0; for (Clave del objeto: map.keySet()) {'Valor del objeto = map.get (clave); índice ++; } // formateo de dang – benjineer

10

Si todo lo que está tratando de hacer es obtener el valor de la propia HashMap, se puede hacer algo como lo siguiente:

for (Object key : map.keySet()) { 
    Object value = map.get(key); 
    //TODO: this 
} 

O bien, puede iterar sobre las entradas de un mapa, si eso es lo que le interesa:

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

Como En una comunidad, podríamos darle mejores/más respuestas apropiadas si tuviéramos alguna idea de por qué necesitaba los índices o qué pensaba que los índices podrían hacer por usted.

45

Uso LinkedHashMap en lugar de HashMap Será siempre claves en el mismo orden de restitución (como la inserción) cuando se llama conjunto de claves()

Para más detalles, ver Class LinkedHashMap

+0

El pedido puede no ser importante; es posible que solo tengamos que probar el primer o el último par de lectura, por ejemplo. – benjineer

4

poco estuve aprendiendo los conceptos detrás de Hashmap y estaba claro que no había un orden definido de las llaves. iterar puede utilizar:

Hashmap<String,Integer> hs=new Hashmap(); 
for(Map.Entry<String, Integer> entry : hs.entrySet()){ 
     String key=entry.getKey(); 
     int val=entry.getValue(); 
     //your code block 
    } 
2

publicar esto como una alternativa viable a @Binil igualmente la respuesta de Thomas - trataron de añadirlo como un comentario, pero no estaba convencido de la legibilidad de todo.

int index = 0; 

for (Object key : map.keySet()) { 
    Object value = map.get(key); 
    ++index; 
} 

Probablemente no ayuda el cartel pregunta original ya que esta es la situación literal que estaban tratando de evitar, pero puede ayudar a otros en busca de una respuesta fácil.