2013-04-08 7 views
5

मैं Map<K, V> को List<K> keys, List<V> values सूचियों में कैसे परिवर्तित कर सकता हूं, जैसे keys और values मिलान में आदेश? मैं केवल का उपयोग कर Set<K> Map#keySet() और Collection<V> Map#values() जो मैं सूचियों में परिवर्तित कर सकते हैं पा सकते हैं:ऑर्डर रखने के दौरान मानचित्र को <K, V> दो सूची में कैसे परिवर्तित करें?

List<String> keys = new ArrayList<String>(map.keySet()); 
List<String> values = new ArrayList<String>(map.values()); 

लेकिन मुझे चिंता है कि आदेश यादृच्छिक किया जाएगा।

क्या यह सही है कि मुझे उन्हें मैन्युअल रूप से परिवर्तित करना है या कहीं शॉर्टकट है?

अद्यतन: How to efficiently iterate over each Entry in a Map?

+0

पर एक नज़र मैं ArrayList जिस क्रम में हम डालने को बरकरार रखता है लगता है के रूप में ही करने की जरूरत है। –

+2

@AchintyaJha हाँ, यह करता है। हालांकि, मानचित्र द्वारा वापस सेट किया गया सेट आदेश दिया गया है? –

+0

+1 यह मानने के लिए कि दो संग्रह (कुंजी और मान) में एक ही ऑर्डरिंग होगी। – yshavit

उत्तर

10

उपयोग Map.entrySet():

List<String> keys = new ArrayList<>(map.size()); 
List<String> values = new ArrayList<>(map.size()); 
for(Map.Entry<String, String> entry: map.entrySet()) { 
    keys.add(entry.getKey()); 
    values.add(entry.getValue()); 
} 
+0

+1, लेकिन आइए जावा 1.5 में अपग्रेड करें और जेनेरिक का उपयोग करें। आखिरकार, जावा 1.8 बस कोने के आसपास है। – yshavit

+0

पूरी तरह से सहमत हैं - मैं सिर्फ एक आईडीई का उपयोग नहीं कर रहा था और उन्हें सही तरीके से प्राप्त करना मुश्किल हो सकता है। – rongenre

+1

जावा 7 जेनेरिक को प्रतिबिंबित करने के लिए संपादित किया गया। –

1

आप के रूप में आप का उल्लेख कुंजियों की सूची निकालने चाहिए और उसके बाद पुनरावृति: जवाब मैं अतिरिक्त उपयोगी जानकारी जो मैं, यादृच्छिक गूगल उपयोगकर्ता आपके साथ साझा करना चाहते खोजने के लिए सक्षम था के कारण उन पर और निकालने मान:

List<String keys = new ArrayList<String>(map.keySet()); 
List<String> values = new ArrayList<String>(); 
for(String key: keys) { 
    values.add(map.get(key)); 
} 
+1

आप दोनों कुंजी और मान प्राप्त करने के लिए 'एंट्रीसेट' पर भी पुनरावृत्ति कर सकते हैं। –

+0

यह सच है - जटिलता के अनुसार यह वही है। – Avi

1

आप map.entrySet() से अधिक पुनरावृति सकता है, दो सूचियों के लिए कुंजी और मूल्यों जोड़कर।

1

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

आप एक मानचित्र की यात्रा के क्रम प्रविष्टि आदेश से LinkedHashMap

+0

मुझे ऑर्डर की परवाह नहीं है, सिवाय इसके कि मुझे दो परिणामस्वरूप सूचियों में एक ही "स्थिति" पर एक जोड़ी (कुंजी, मान) चाहिए। –

+0

क्या यह 'इटरेटर' नहीं करता है? सच है, आप यह सुनिश्चित नहीं कर सकते कि मानचित्र किस क्रम में है, लेकिन आप यह सुनिश्चित कर सकते हैं कि 'एंट्रीसेट' के माध्यम से 'Iterator' एक विशिष्ट क्रम में पुनरावृत्त हो जाता है। – GameDroids

+0

@ मिचावाइडेनमैन: ठीक है तो आपके पास अपनी दो सूचियों में मूल्य डालने के बारे में चिंता करने की कोई बात नहीं है। सूचियों को बाद में बदलने पर बस विशेष देखभाल करें। – GameDroids

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