2011-09-27 6 views
11

私は、次のコードを持っていますが、私はkeySet()を持つMapキーを反復しながら、地図から値を取得すると私は警告WMI_WRONG_MAP_ITERATOR<p>なぜこれがうまくいかないのですか?どのように修正できますか?</p> <p>ありがとうございました。</p>

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

    element = mapElements.get(elementId); 

    doSomething(element); 
} 
を取得してもFindBugsのと間違いであることを見たの回避
+4

これはもちろんドキュメント(http://findbugs.sourceforge.net/bugDescriptions.html#WMI_WRONG_MAP_ITERATOR)で説明されています。 –

答えて

23

あなたがマップに以上のすべてを反復している場合、あなたにも行う可能性があります:

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

それとも、本当にただの値を反復、キーを必要としない場合:

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

EDIT: - あなたがmodiyあるときに問題となるものですマップ自体を反復処理しながら、マップから値を取得構文

0

は問題ではありません同時に地図を繰り返しながら地図を描くことができます。あなたの場合、これはそうではないようです。だから、それ自体は危険ではありません。

マップを反復処理するとき、取得するイテレータは、イテレータを取得した時点のすべてのマップエントリのスナップショットに基づいています。その後のミドリゼーションでは、このイテレーターの動作は未定義になります。これは良くないことです。しかし、あなたの場合は、マップを更新していないため、これは適用されません。

0

マップが大きい場合は、各キーの値を調べるのに費用がかかることがあります。 Jon Skeetの提案はより効率的です。しかし、マップのエントリセットを反復するコードはちょっと不思議です。

関連する問題