2012-09-05 9 views
12

की तरह नक्शे के लिए:Map.keySet और Map.values ​​पर समान पुनरावृत्ति आदेश?

Map<Integer, Integer> map = ...; 
map.put(1, 1); 
map.put(2, 2); 
map.put(3, 3); 
map.put(4, 4); 

इस कोड है ...

for (Integer i : map.keySet()) System.out.println(i); 
for (Integer i : map.values()) System.out.println(i); 

... गारंटी प्रिंट एक ही उसी क्रम में दो बार?

यदि नहीं, तो उदाहरण के लिए java.util.HashMap कोई गारंटी है?

+0

संभावित डुप्लिकेट [जावा हैशैप कीसेट() पुनरावृत्ति क्रम संगत है?] (Http://stackoverflow.com/questions/1882762/is-the-java-hashmap-keyset-iteration-order-consistent) – assylias

+0

@ assylias: यह सवाल कुंजी सेट बनाम मूल्यों के संबंध में है। – dacwe

+0

@ डैक्सवे आपका प्रश्न है: क्या 2 लूप एक ही चीज़ को प्रिंट करेंगे यदि उन्हें दो बार बुलाया जाता है, या आपका प्रश्न है: क्या चाबियों पर लूप और मूल्यों पर लूप उसी क्रम में संबंधित कुंजी/मान मुद्रित करेगा? – assylias

उत्तर

16

नहीं, कोई गारंटी नहीं है, हालांकि अभ्यास में ऐसा होगा (नक्शा के लिए कुंजी और मूल्यों के लिए एक अलग इटरेटर का उपयोग करने का कोई अच्छा कारण नहीं है)।

आप यात्रा के क्रम की गारंटी चाहते हैं, पुनरावृति entrySet():

for (Map.Entry<Integer,Integer> entry : map.entrySet()) 
    // ... 

जब से तुम, के बारे में HashMap, नोट भी है कि नक्शे में कोई परिवर्तन संभावित यात्रा क्रम बदल जाएगा पूछना rehashed mapbeing के परिणामस्वरूप ।

+0

अच्छा विकल्प, बहुत बहुत धन्यवाद :) – Luvie

+0

मैंने अभी [मानचित्र javadoc] (https://docs.oracle.com/javase/8/docs/api/java/util/Map.html#entrySet--) पढ़ा है और 'entrySet()' के लिए कोई ऑर्डर गारंटी नहीं है। आपको वह कहां से मिला? – Roland

7

नहीं, गारंटी नहीं है। एक Set है और एक Collection है, न तो आदेश की गारंटी।

यदि आप आदेश रखना चाहते हैं। LinkedHashMap()entrySet() के साथ आपकी सहायता कर सकते हैं।

+1

+1 भले ही उन्हें आदेश दिया गया हो, फिर भी कोई गारंटी नहीं है कि उनके पास एक ही आदेश होगा। ;) –

-1

हां। की तरह। आप SortedMap के उप-वर्ग का उपयोग कर सकते हैं, यानी TreeMap। वह कुंजी को प्राकृतिक क्रम में रखेगा। (या आप इसे एक विशिष्ट तुलनित्र दे सकते हैं)। लेकिन जब आप पेड़ मानचित्र का उपयोग करते हैं, तो आपको यह सुनिश्चित करना होगा कि तुलना करने के लिए विधि "बराबर के अनुरूप होनी चाहिए"। अधिक जानकारी के लिए javadocs पढ़ें। लेकिन संक्षेप में, हाँ, आप एक नक्शा क्रमबद्ध कर सकते हैं।

+0

सवाल यह नहीं था कि आप एक नक्शा सॉर्ट कर सकते हैं, यह था कि चाबियों का सेट 'keySet()' से लौटाया गया था और 'valueSet() 'से लौटाए गए मानों का सेट आदेश दिया जाएगा ताकि n: th key कुंजी सेट में मान सेट में n: th मान से मेल खाता है। ऐसी कोई गारंटी नहीं है। इस बात की भी कोई गारंटी नहीं है कि जिस क्रम में कुंजी और मान 'कुंजीसेट() 'और' वैल्यूसेट()' से लौटाए जाते हैं, लगातार दो चालानों के लिए समान होते हैं। – JHH

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