2011-09-27 13 views
11

Ho il seguente codice, ma ho visto che il recupero di valori da una mappa, mentre l'iterazione delle chiavi mappa con keySet() è un errore anche con FindBugs ottengo l'avvertimento WMI_WRONG_MAP_ITERATOREvitare map.get (chiave) Metodo

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

    element = mapElements.get(elementId); 

    doSomething(element); 
} 

quindi perché esattamente questo non è buono e come posso risolvere il problema?

Grazie.

+4

Questo è ovviamente spiegato nella documentazione (http://findbugs.sourceforge.net/bugDescriptions.html#WMI_WRONG_MAP_ITERATOR) –

risposta

23

Se stai iterazione di tutto in una mappa, si potrebbe anche fare:

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

O se non si ha realmente bisogno della chiave, basta scorrere i valori:

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

EDIT: sintassi

0

Recupero di valori da una mappa, mentre l'iterazione sopra la mappa stessa non è un problema - quello che diventa un problema è quando si è modiy la mappa mentre contemporaneamente la itera su di essa. Nel tuo caso, questo non sembra essere il caso, quindi questo non è di per sé pericoloso.

Quando si itera su una mappa, l'iteratore che si ottiene si basa su un'istantanea di tutte le voci della mappa nel momento in cui si ottiene l'iteratore. A seguito della successiva midificazione, il comportamento di questo iteratore diventa indefinito. Questo è ciò che non è buono. Ma ancora una volta, nel tuo caso questo non si applica perché non stai aggiornando la mappa.

0

Un altro punto è che cercare il valore di ogni chiave può essere costoso se la mappa è grande. Quindi il suggerimento di Jon Skeet è più efficiente. Tuttavia, ammetto che il codice per iterare sul set di voci di una mappa è un po 'goffo.

Problemi correlati