/ / FindBugs चेतावनी: कीसेट इटरेटर का अकुशल उपयोग

फाइंडबग्स चेतावनी: कीसेट इटरेटर का अकुशल उपयोग

यह एक समान प्रश्न है [फाइंडबग्स चेतावनी: एंट्रीसेट इटरेटर के बजाय कीसेट इटरेटर का अक्षम उपयोग

हालांकि, वहां मैं कुछ अलग करने की कोशिश कर रहा हूं। मेरा वर्तमान कोड यहाँ है:

for (Double key2 : sortedPolygons.keySet()) {
if (sortedPolygons.get(key2).getExteriorRing().equals(hole)) {
sortedPolygons.remove(key2);
break;
}
}

लिंक में समाधान की तरह कुछ करने से काम नहीं चलता है। यहाँ कहा समाधान का कार्यान्वयन है:

for(Map.Entry<Double, Polygon> entry : sortedPolygons.entrySet()) {
if (entry.getValue().getExteriorRing().equals(hole)) {
.....

यहां समस्या यह है कि मैं कोशिश कर रहा हूं हटाना प्रवेश। कोई नहीं है entry.remove()। मैं FindBugs त्रुटि के बिना अपने पहले ब्लॉक कोड को कैसे बदल सकता हूं:

एंट्रीसेट इटरेटर के बजाय कीसेट इटरेटर का अक्षम उपयोग ->

यह विधि एक मानचित्र प्रविष्टि के मान को एक्सेस करती है,एक कुंजी का उपयोग कर रहा था KeySet पुनरावृत्त से पुनर्प्राप्त। यह एक का उपयोग करने के लिए और अधिक कुशल है Map.get (कुंजी) लुकअप से बचने के लिए मैप के एंट्रीसेट पर itter।

ध्यान देने के लिए, अंतर्निहित संरचना है TreeMap, और इसे बदला नहीं जा सकता।

उत्तर:

जवाब के लिए 5 № 1

मैं आपके तर्क को समझने में विफल रहा: पहले स्निपेट में, आप उपयोग करते हैं

sortedPolygons.remove(key2);

एक कुंजी को दूर करने के लिए। दूसरे स्निपेट में आपको कुछ भी करने से रोकता है:

sortedPolygons.remove(entry.getKey());

जिस तरह से आप इसे पुनरावृत्त करते हैं, यह एक को जन्म देगा ConcurrentModificationException वैसे भी, क्योंकि अधिकांश संग्रहों के लिए, आप "अपने पुनरावृति का उपयोग करके, उस पर पुनरावृत्ति करते हुए इसे संशोधित नहीं कर सकते हैं।"

कोट फ़ॉर्म javadoc:

पुनरावृत्तियों के पुनरावृत्तियों द्वारा पुनरावृत्तियाँइस वर्ग के "संग्रह दृश्य विधियों" के द्वारा लौटाए गए सभी संग्रह विफल-तेज़ हैं: यदि इट्रेटर के बनने के बाद किसी भी समय मैप को संरचनात्मक रूप से संशोधित किया जाता है, तो किसी भी तरह से इटेटर के स्वयं के हटाने के तरीके को छोड़कर, इट्रेटर एक समवर्तीModificationException फेंक देंगे।

तो कोड होना चाहिए:

for (Iterator<Map.Entry<Double, Polygon>> it = sortedPolygons.entrySet().iterator(); it.hasNext(); ) {
Map.Entry<Double, Polygon> entry = it.next();
if (entry.getValue().getExteriorRing().equals(hole)) {
it.remove();
// if you want to exit the loop as soon as you found a match:
break;
}
}

जवाब के लिए 3 № 2

कैसे के बारे में आप के रूप में प्रविष्टिईसेट () itter का उपयोग करें।

for(Iterator<Map.Entry<Double, Ploygon>> iter = sortedPolygons.entrySet().iterator();
iter.hasNext();) {
Map.Entry<Double, Ploygon> entry = iter.next();

if (condition)
iter.remove();
}

हालाँकि, आपको कुंजी की आवश्यकता नहीं है इसलिए आप मूल्यों को पुनरावृत्त कर सकते हैं

for(Iterator<Ploygon> iter = sortedPolygons.values().iterator();
iter.hasNext();) {
Ploygon ploygon = iter.next();

if (condition)
iter.remove();
}