2011-03-25 16 views
10

मैं निम्नलिखित जावा कोड है:जावा पुनरावृत्ति

public void myMethod (final Map pFeatureGroupsFromPackage) { 

    final Set<String> keys = pFeatureGroupsFromPackage.keySet(); 

    for (final String key : keys) { 
      tmpList = (List<FeatureKey>) pFeatureGroupsFromPackage.get(key); 
    // do whatever 
    } 
} 

मैं "FindBugs" कह निम्नलिखित से एक चेतावनी हो रही है:

विधि myMethod बजाय entrySet कीसेट इटरेटर का अकुशल प्रयोग में आता है इटरेटर। चेतावनी tmpList असाइनमेंट पर की जाती है।

मुझे समझ में नहीं आता कि यह अक्षम क्यों है। वास्तव में keys सूची केवल एक बार गणना की जाती है। कोई टिप्पणी? धन्यवाद।

उत्तर

23
keySet से अधिक बार-बार दोहराना और get बुला प्रत्येक कुंजी के लिए संबंधित मान प्राप्त करने के लिए करने के बजाय

, entrySet से अधिक पुनरावृति:

final Set<Map.Entry<String, List<FeatureKey>>> entries = pFeatureGroupsFromPackage.entrySet(); 

for (Map.Entry<String, List<FeatureKey>> entry : entries) { 
    String key = entry.getKey(); 
    List<FeatureKey> tmpList = entry.getValue(); 

    // do whatever 
} 

इस तरह आपको हर कुंजी के लिए मानचित्र में एक लुकअप करने की ज़रूरत नहीं है; आप सीधे एक बार में कुंजी और मूल्य प्राप्त करते हैं। चाबी के लिए, पहले - - और मूल्यों

के लिए दूसरे का उपयोग करना:

इसके अलावा, आपके Map प्रकार मानकों के साथ की घोषणा:

public void myMethod (final Map<String, List<FeatureKey>> pFeatureGroupsFromPackage) { 
    // ... 
} 
+0

हाय जेस्पर। आपके उत्तर के लिए धन्यवाद। बीटीडब्लू, दो वाक्यविन्यास त्रुटियां हैं (एक गायब '>' और यह प्रवेश करने के बजाय प्रवेश होना चाहिए) :-) +1 और आपके लिए स्वीकृत – Luixv

+0

@ लुईक्सव धन्यवाद, टाइपो को ठीक किया गया। – Jesper

4

आप सभी चाबियाँ हो रही है और फिर आप संग्रह

एक Map.EntrySet यात्रा बहुत तेजी से हो सकता है, एक छोटा सा उदाहरण में हर कुंजी के लिए खोज:

लेकिन क्या आप भी जेनरिक का उपयोग करना चाहिए। ..

Set entries = map.entrySet(); 
     Iterator entryIter = entries.iterator(); 
     System.out.println("The map contains the following associations:"); 
     while (entryIter.hasNext()) { 
     Map.Entry entry = (Map.Entry)entryIter.next(); 
     Object key = entry.getKey(); // Get the key from the entry. 
     Object value = entry.getValue(); // Get the value. 
     System.out.println(" (" + key + "," + value + ")"); 
     } 
0

यह हो सकता है कि आप नक्शे दो बार में जानना चाहते हैं एंट्रीसेट इटरेटर एक बार मानचित्र पर फिर से शुरू होगा।

0

कुंजीसेट इटरेटर के माध्यम से हैश मैप एक्सेस करना ट्रीमैप पर कीसेट इटरेटर का उपयोग करने से भी तेज है।

0

हे लुइक्सव, कुंजीसेई इटरेटर का उपयोग करने का कारण एंट्रीसेट इटारेटोट से कम प्रभावी है कि पहले विकल्प के साथ आपको अभी भी Map.get (key) lookeup का उपयोग करना होगा जो दूसरे विकल्प से बचा जाता है।

3

यह आपको मदद कर सकता है:

Map map = new HashMap(); 
Iterator entries = map.entrySet().iterator(); 
while (entries.hasNext()) { 
    Map.Entry entry = (Map.Entry) entries.next(); 
    Integer key = (Integer)entry.getKey(); 
    Integer value = (Integer)entry.getValue(); 
    System.out.println("Key = " + key + ", Value = " + value); 
} 
0

नमूना कोड:

for (Map.Entry < Integer, List <FeatureKey>>> i: map.entrySet()) { 
    System.out.println(i.getValue() + " " + i.getKey())); 
} 
संबंधित मुद्दे