2010-09-09 13 views
12

हम अमरूद के साथ ऐसा कैसे कर सकते हैं? वापसी प्रकार में List<K> की उपस्थिति पर ध्यान दें क्योंकि कई कुंजी किसी भी सामान्य मानचित्र में एक ही मान पर मानचित्र कर सकते हैं।गैर-अद्वितीय मूल्यों के साथ गुवा के साथ नक्शा उलटा कैसे करें?

public static <K, V> Map<V, List<K>> inverse(Map<K, V> map){ 
    Map<V, List<K>> result = new LinkedHashMap<V, List<K>>(); 
    for (Map.Entry<K, V> entry : map.entrySet()) { 
     if(!result.containsKey(entry.getValue())){ 
      result.put(entry.getValue(), new ArrayList<K>());     
     } 
     result.get(entry.getValue()).add(entry.getKey()); 
    }   
    return result;   
} 

BiMap मूल्यों की Unicity पर जोर देते हैं लगता है, लेकिन मैं इस लक्जरी नहीं है।

उत्तर

27

आप ऐसा कर सकते हैं:

Map<K, V> map = ...; 
ListMultimap<V, K> inverse = Multimaps.invertFrom(Multimaps.forMap(map), 
    ArrayListMultimap.<V,K>create()); 

ध्यान दें कि काफी किसी भी समय आप Map<K, List<V>> या Map<K, Set<V>> या कुछ इस तरह, लिखना क्या एक ListMultimap<K, V> या SetMultimap<K, V> आप वास्तव में क्या चाहते हैं।

+0

अच्छा, वह तेज़ था। – lacroix1547

+1

लेकिन मल्टीमैप में कनवर्ट करने के लिए मजबूर होना परेशान है। और प्रदर्शन पर किए गए प्रयासों पर विचार करते हुए, भविष्य में इसे और अधिक सेक्सी के साथ सुधार किया जा सकता है। – lacroix1547

+2

@ lacroix1547 हू? 'Multimaps.forMap()' दिए गए मानचित्र का _view_ देता है। यह लगभग कोई काम नहीं करता है ... यह सिर्फ एक कन्स्ट्रक्टर को कॉल करता है और मानचित्र को एक फ़ील्ड में असाइन करता है। बस। इसे एक एडाप्टर पर विचार करें जो आपको 'invertFrom()' जैसी विधियों के साथ मानचित्र का उपयोग करने की अनुमति देता है जो 'मल्टीमैप' की अपेक्षा करता है। – ColinD

7

इसके बजाय एक मल्टीमैप का उपयोग करें, एक सूची का उपयोग करने वाले एक को चुनें, जैसे ArrayListMultimap, जो डुप्लिकेट की अनुमति देगा।

इसके अलावा आपको अपनी खुद की उलटा विधि लिखने की ज़रूरत नहीं है, com.google.common.collect.Multimaps में कोई भी प्रदान किया गया है।

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