2012-09-07 18 views
33

मेरे पास LinkedHashMap घोषणा का अनुसरण किया गया है।लिंक्ड हैशैप के माध्यम से सूचियों के साथ पुनरावृत्त कैसे करें

LinkedHashMap<String, ArrayList<String>> test1 

मेरी बात मैं कैसे इस हैश मानचित्र के माध्यम से पुनरावृति कर सकते हैं। मैं इसे निम्नलिखित करना चाहता हूं, क्योंकि प्रत्येक कुंजी को संबंधित सरणीसूची मिलती है और सरणी के मानों को कुंजी के विरुद्ध एक करके प्रिंट किया जाता है।

मैंने कोशिश की यह लेकिन मिल केवल स्ट्रिंग देता है,

String key = iterator.next().toString(); 
ArrayList<String> value = (ArrayList<String>)test1.get(key) 

उत्तर

104
for (Map.Entry<String, ArrayList<String>> entry : test1.entrySet()) { 
    String key = entry.getKey(); 
    ArrayList<String> value = entry.getValue(); 
    // now work with key and value... 
} 

वैसे, अगर तुम सच में अपने चर इंटरफ़ेस प्रकार बजाय के रूप में, इस तरह के Map<String, List<String>> के रूप में घोषित करना चाहिए।

+2

btw, मैं प्रविष्टि आदेश के साथ सूची करना चाहते हैं, मैं पहले hashmap इस्तेमाल किया, लेकिन यह क्रम में गड़बड़। –

+4

मैं यह नहीं कह रहा हूँ 'LinkedHashMap' उपयोग न करें - लेकिन आम तौर पर सबसे अच्छा अभ्यास' नक्शा <स्ट्रिंग, सूची > नक्शा = नए LinkedHashMap <स्ट्रिंग, सूची > 'जैसी चीजों घोषित करने के लिए है। –

+1

@Pbasak आप घोषणा के लिए केवल इंटरफ़ेस प्रकार का उपयोग करते हैं। जब आप नक्शे वस्तु का दृष्टांत आप अभी भी अपने 'LinkedHashMap' सुनिश्चित करें कि प्रविष्टि आदेश में ही रहता है कर देगा जो प्रयोग करेंगे। इस तरह से आप लागू करने की अपनी पसंद के साथ चिपके रहते हैं, लेकिन अभी भी बाहर करने के लिए और अधिक सामान्य प्रकार का उपयोग करें। –

5

आप प्रविष्टियों पर एंट्री सेट और पुनरावृत्त का उपयोग कर सकते हैं जो आपको सीधे, कुंजी और मूल्य दोनों तक पहुंचने की अनुमति देता है।

for (Entry<String, ArrayList<String>> entry : test1.entrySet() { 
    System.out.println(entry.getKey() + "/" + entry.getValue()); 
} 

मैं इस कोशिश की, लेकिन केवल रिटर्न मिल स्ट्रिंग

आप ऐसा क्यों सोचते हैं? विधि getE प्रकार देता है जिसके लिए जेनेरिक टाइप पैरामीटर चुना गया था, आपके मामले में ArrayList<String>

7
// iterate over the map 
for(Entry<String, ArrayList<String>> entry : test1.entrySet()){ 
    // iterate over each entry 
    for(String item : entry.getValue()){ 
     // print the map's key with each value in the ArrayList 
     System.out.println(entry.getKey() + ": " + item); 
    } 
} 
+2

पर जवाब कभी इस बारे में सोचा देखते हैं, मैं सी # में foreach इस्तेमाल किया, इस के समान है। –

11

मैं तुम्हें अपने get बयान लिखने में कोई गलती है और यह test1.get किया जाना चाहिए (कुंजी) कि यह सोचते हैं रहा हूँ। यदि ऐसा है, तो मुझे यकीन नहीं है कि यह एक ArrayList क्यों नहीं लौटा रहा है जब तक आप पहले स्थान पर सही प्रकार में नहीं डाल रहे हैं।

यह काम करना चाहिए:

// populate the map 
Map<String, List<String>> test1 = new LinkedHashMap<String, List<String>>(); 
test1.put("key1", new ArrayList<String>()); 
test1.put("key2", new ArrayList<String>()); 

// loop over the set using an entry set 
for(Map.Entry<String,List<String>> entry : test1.entrySet()){ 
    String key = entry.getKey(); 
    List<String>value = entry.getValue(); 
    // ... 
} 

या आप

// second alternative - loop over the keys and get the value per key 
for(String key : test1.keySet()){ 
    List<String>value = test1.get(key); 
    // ... 
} 

उपयोग कर सकते हैं जब आपकी वार्स की घोषणा (और अपने सामान्य पैरामीटर में) इंटरफेस नामों का उपयोग करना है जब तक आप एक बहुत ही विशेष कारण है आप कार्यान्वयन का उपयोग कर परिभाषित क्यों कर रहे हैं।

+0

हाय मैंने तत्वों को सम्मिलन क्रम में रखने के लिए लिंकशैशमैप का उपयोग किया। –

+0

निश्चित - लेकिन उदाहरण बनाते समय आप LinkedHashMap निर्दिष्ट कर सकते हैं। हालांकि, चर के लिए इंटरफ़ेस नाम का उपयोग करने से आप कोड कार्यान्वयन को स्वतंत्र बना सकते हैं। यानी: आप सब कुछ रिकोड करने की आवश्यकता के बिना बाद के बिंदु पर कुछ और के साथ कार्यान्वयन को आसानी से बदल सकते हैं। इंटरफ़ेस का उपयोग करके घोषणा के लिए उपरोक्त मेरा उदाहरण देखें, और कार्यान्वयन के लिए LinkedHashMap। –

2

जावा 8 में:

Map<String, List<String>> test1 = new LinkedHashMap<String, List<String>>(); 
test1.forEach((key,value) -> { 
    System.out.println(key + " -> " + value); 
}); 
संबंधित मुद्दे