2011-09-27 2 views
11

나는 다음과 같은 코드를하지만 난 keySet()와지도 키를 반복하면서지도에서 값을 가져 오는 심지어 내가 경고를 얻을 findBugs와 실수는 것을보고이 WMI_WRONG_MAP_ITERATOR방지 map.get (키) 방법

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

    element = mapElements.get(elementId); 

    doSomething(element); 
} 

그럼 왜 이것이 좋지 않은가, 어떻게 해결할 수 있을까?

감사합니다.

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

을 또는 당신이 정말로 그렇게하지 않으면 그냥 값을 반복, 키가 필요합니다 :

+4

물론 이것은 설명서 (http://findbugs.sourceforge.net/bugDescriptions.html#WMI_WRONG_MAP_ITERATOR)에서 설명합니다. –

답변

23

당신이지도에서 모든 반복하는 경우, 당신은 잘 할 수

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

편집 : - 당신이 modiy 때 문제가된다 무엇을하는지도 자체를 반복하는 동안 맵에서 값을 가져 오는 구문

0

는 문제가되지 않습니다 지도를 반복하면서 동시에 반복합니다. 귀하의 경우,이 경우에 해당하지 않는 것처럼 보이므로이 자체는 위험하지 않습니다.

지도를 반복 할 때 얻을 수있는 반복기는 반복기를 구할 때 모든지도 항목의 스냅 샷을 기반으로합니다. 후속 midification시,이 반복자의 동작은 정의되지 않습니다. 이것은 좋지 않은 것입니다. 하지만 다시 한 번, 귀하의 경우지도를 업데이트하지 않기 때문에 이것은 적용되지 않습니다.

0

다른 점은지도가 큰 경우 각 키의 값을 조회하는 것이 비용이 많이들 수 있다는 것입니다. 그래서 Jon Skeet의 제안이 더 효율적입니다. 그러나지도의 항목 집합을 반복하는 코드는 조금 어색하다는 것을 인정합니다.