2011-09-27 33 views
11

मैं निम्नलिखित कोड, लेकिन मैं ने देखा कि एक मानचित्र से मूल्यों को पुन: प्राप्त करने keySet() साथ मानचित्र चाबियाँ पर पुनरावृत्ति करते हुए भी FindBugs मैं चेतावनी मिलती है के साथ एक गलती है WMI_WRONG_MAP_ITERATORबचना map.get (key) विधि

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

    element = mapElements.get(elementId); 

    doSomething(element); 
} 

तो यह वास्तव में अच्छा क्यों नहीं है और मैं इसे कैसे ठीक कर सकता हूं?

धन्यवाद।

+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); 
} 

संपादित करें: - क्या एक मुद्दा बन जाता है जब आप modiy हैं वाक्य रचना

0

मानचित्र से मान प्राप्त कर रहा है मानचित्र पर ही पुनरावृत्ति करते हुए कोई मुद्दा नहीं है मानचित्र पर एक साथ रहते हुए एक साथ फिर से चल रहा है। आपके मामले में, यह मामला प्रतीत नहीं होता है, इसलिए यह स्वयं खतरनाक नहीं है।

आप एक नक्शे पर पुनरावृति करते हैं, इटरेटर आप प्राप्त सभी नक्शा प्रविष्टियों बार जब आप इटरेटर प्राप्त पर का एक स्नैपशॉट पर आधारित है। बाद के मध्यीकरण पर, इस इटरेटर का व्यवहार अपरिभाषित हो जाता है। यह अच्छा नहीं है। लेकिन फिर, आपके मामले में यह लागू नहीं होता है क्योंकि आप मानचित्र को अपडेट नहीं कर रहे हैं।

0

एक और मुद्दा प्रत्येक कुंजी का मान प्राप्त करने के लिए देख महंगा हो सकता है कि अगर नक्शा बड़ा है। तो जॉन स्कीट का सुझाव अधिक कुशल है। हालांकि, मैं एक मानचित्र के प्रवेश सेट पर पुनरावृत्ति के लिए कोड स्वीकार करता हूं थोड़ा सा बेकार है।

संबंधित मुद्दे