2011-09-27 9 views
11

Tengo el siguiente código pero vi que la recuperación de los valores de un mapa, mientras que iterar sobre las claves mapa con keySet() es un error incluso con FindBugs Me da la advertencia WMI_WRONG_MAP_ITERATORmap.get Evitar (clave) Método

for(String elementId : mapElements.keySet()){ 

    element = mapElements.get(elementId); 

    doSomething(element); 
} 

¿por qué exactamente esto no es bueno y cómo puedo solucionarlo?

Gracias.

+4

Esto, por supuesto, se explica en la documentación (http://findbugs.sourceforge.net/bugDescriptions.html#WMI_WRONG_MAP_ITERATOR) –

Respuesta

23

Si está interactuando sobre todo en un mapa, que también podría hacer:

for (Map.Entry<String, String> entry : mapElements.entrySet()) { 
    String key = entry.getKey(); 
    String value = entry.getValue(); 
    // Use the key and the value 
} 

O si usted realmente no necesita la llave, simplemente iterar sobre los valores:

for (String value : mapElements.values()) { 
    doSomething(value); 
} 

EDIT: sintaxis

0

Recuperación de valores de un mapa, mientras que la iteración en el mapa en sí no es un problema - lo que se convierte en un problema cuando se está modiy el mapa mientras se itera simultáneamente sobre él. En su caso, este no parece ser el caso, por lo que esto no es peligroso.

Cuando itera sobre un mapa, el iterador que obtiene se basa en una instantánea de todas las entradas del mapa en el momento en que obtiene el iterador. Tras la midificación posterior, el comportamiento de este iterador queda indefinido. Esto es lo que no está bien. Pero, nuevamente, en tu caso, esto no se aplica porque no estás actualizando el mapa.

0

Otro punto es que buscar el valor de cada clave puede ser costoso si el mapa es grande. Entonces la sugerencia de Jon Skeet es más eficiente. Sin embargo, admito que el código para iterar sobre el conjunto de entrada de un mapa es un poco torpe.

Cuestiones relacionadas