2012-12-05 10 views
5

मैं उपरोक्त कार्यक्रम के इसमानचित्र में एकाधिक मानों के साथ एक कुंजी कैसे प्राप्त करें?

Map map=new HashMap();//HashMap key random order. 
map.put("a",10); 
map.put("a",20); 
map.put("a",30); 
map.put("b",10); 

System.out.println("There are "+map.size()+" elements in the map."); 
System.out.println("Content of Map are..."); 
Set s=map.entrySet(); 
Iterator itr=s.iterator(); 
while(itr.hasNext()) 
{ 
    Map.Entry m=(Map.Entry)itr.next(); 
    System.out.println(m.getKey()+"\t"+m.getValue()+"\t"+ m.hashCode()); 
} 

आउटपुट की तरह एक नक्शा

There are 2 elements in the map. 
Content of Map are... 
b 10 104 
a 30 127 

है अब मैं चाहता हूँ कि एक

a 10 
a 20 
a 30 

तो यह है कि मैं चाहिए की तरह अधिक मान चाहिए कुंजी है ए द्वारा जुड़े सभी मूल्य प्राप्त करें। कृपया सलाह दें कि मैं वही चीज़ कैसे प्राप्त कर सकता हूं। संग्रहों के घोंसले से, मैं सभी तीन मानों के लिए कुंजी 'ए' चाहता हूं।

उत्तर

12

क्या आपने Guava Multimaps चेक आउट किया है?

एक संग्रह एक मानचित्र के समान है, लेकिन जो एक एकल कुंजी के साथ एक से अधिक मान संबद्ध कर सकते हैं । यदि आप एक ही कुंजी के साथ दो बार (के, वी) को कॉल करते हैं, लेकिन अलग-अलग मानों के साथ, मल्टीमैप में मान दोनों की कुंजी से मैपिंग शामिल है।

यदि आप वास्तव में मानक संग्रह (जैसा कि नीचे सुझाया गया है) का उपयोग करना चाहते हैं, तो आपको प्रति कुंजी संग्रह संग्रह करना होगा।

map = new HashMap<String, Collection<Integer>>(); 

ध्यान दें कि पहली बार जब आप एक नया कुंजी दर्ज करें, तो आपको पहले मूल्य जोड़ने से पहले नए संग्रह (List, Set आदि) बनाने के लिए होगा।

+0

मैं जावा में देख रहा था खुद को जावा में बताएं – user1876121

+0

अमरूद एक व्यापक रूप से इस्तेमाल जावा है पुस्तकालय। नोट फिर से ऊपर मेरी टिप्पणी। नक्शे के भीतर संग्रह –

2

मूल्य भाग में ArrayList उदाहरण दें।

void addValue(Map map, Object key, Object value) { 
    Object obj = map.get(key); 
    List list; 
    if (obj == null) { 
     list = new ArrayList<Object>(); 
    } else { 
     list = ((ArrayList) obj); 
    } 
    list.add(value); 
    map.put(key, list); 
} 

अधिक जानकारी के लिए this देखें।

+0

हाय D3EP4K कृपया कोड को पोस्ट करें जो अधिक स्पष्ट समझ जाएगा – user1876121

+0

इस फ़ंक्शन को अपने कोड में रखें और map.put को कॉल करने के बजाय addValue (मानचित्र, नया स्ट्रिंग ("ए"), नया इंटीजर (10)) कॉल करें ("ए", 10) – Sorter

+0

प्रश्न में उल्लिखित दृष्टिकोण के अनुसार, नया मान पुराने स्थान को बदल देता है। – Sorter

0

मान प्रकार के साथ वैल्यू का उपयोग मूल्यों की सूची के रूप में करें .. उदाहरण के लिए, आपके मानचित्र में, एंट्री जोड़ने के दौरान, आप कुंजी को "ए" के रूप में रखेंगे और आपको इसे इंटेगर की सूची के रूप में जोड़ना होगा सभी आवश्यक मूल्य, जैसे 1,2,3,4।

2

आपको जेनेरिक पैरामीटर को अनदेखा नहीं करना चाहिए। क्या आपके पास

Map<String, Integer> map = new HashMap<>(); 

अगर आप समाधान अपने आप को कोड करने के लिए चाहते हैं, आप

Map<String, List<Integer>> map = new HashMap<>(); 

किसी भी तरह की जरूरत है, preffered तरीके से उपयोग करने के लिए है एक Guava Multimap

+0

कृपया कोड पोस्ट करें यह कैसे guava multimap – user1876121

4

लागू करने के लिए क्या आप उपयोग कर चाहते हैं जावा मानक लाइब्रेरी, मैं इस तरह के मानचित्र का उपयोग करूंगा:

Map<String, Collection<Integer>> multiValueMap = new HashMap<String, Collection<Integer>>(); 

फिर आप विज्ञापन कर सकते हैं घ मान:

multiValueMap.put("a", new ArrayList<Integer>()); 
multiValueMap.get("a").add(new Integer(10)); 
multiValueMap.get("a").add(new Integer(20)); 
multiValueMap.get("a").add(new Integer(30)); 

यह आपके लिए असहज परिणाम हैं, तो, एक समर्पित कक्षा में इस व्यवहार को लपेटकर, या किसी तीसरे पक्ष के समाधान के उपयोग पर विचार के रूप में दूसरों को यहाँ (Guava Multimap) का सुझाव दिया है।

+0

में प्राप्त किया गया है हाय think01 यह कास्टिंग से संबंधित कुछ चीज़ जोड़ने पर जटिल समय त्रुटि फेंक रहा है कृपया – user1876121

+0

सलाह दें कि मैं सामान्य मानचित्र घोषणा भूल गया, अब यह सही है। आइए कोशिश करें और मुझे बताएं। – think01

+0

हाँ यह बहुत काम करता है !! लेकिन क्या कोई और तरीका नहीं है जो मैं सरणी सूची से बचने के लिए सोच रहा था .. !! – user1876121

0

एक ही कुंजी के साथ प्रविष्टियों के साथ एक मानचित्र के लिए, जब तक आप iterator() या entrySet() का उपयोग get() .लेकिन उपयोग करने के लिए कोई मतलब नहीं है यह काम करना चाहिए:

class HashMap<String, String> { 

    Set<Entry<String, String>> entries; 
    @Override 
    public Set<Entry<String, String>> entrySet() { 
    return entries; 
    } 

    @Override 
    public int size() { 
    return entries.size(); 
    } 

    public String put(String key, String value) { 
    if (entries == null) { 
     entries = new AbstractSet<Entry<String, String>>() { 

     ArrayList<Entry<String, String>> list = new ArrayList<>(); 
     @Override 
     public Iterator<Entry<String, String>> iterator() { 
      return list.iterator(); 
     } 

     @Override 
     public int size() { 
      return list.size(); 
     } 

     @Override 
     public boolean add(Entry<String, String> stringStringEntry) { 
      return list.add(stringStringEntry); 
     } 
     }; 
    } 
    StatusHandler.MyEntry entry = new StatusHandler.MyEntry(); 
    entry.setKey(key); 
    entry.setValue(value); 
    entries.add(entry); 
    return value; 
    } 
}; 

टी एल; डॉ तो, के लिए यह उपयोगी है ? यही कारण है कि Redmine-जावा-api के लिए प्रपत्र पैरामीटर के आधार पर जटिल प्रश्न को स्वीकार करने के लिए हैक से आता है:

https://stackoverflow.com/a/18358659/848072

https://github.com/albfan/RedmineJavaCLI/commit/2bc51901f2f8252525a2d2258593082979ba7122

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