2012-05-17 11 views
29

मैं सरल चूक के साथ एक नया मल्टीमैप बनाना चाहते हैं, मैं curently की तरह कुछ करने की जरूरत है:अमरूद मल्टीमैप्स बनाने के लिए कॉम्पैक्ट तरीका?

private final Multimap<Key, Value> providersToClasses = Multimaps 
     .newListMultimap(
       new HashMap<Key, Collection<Value>>(), 
       new Supplier<List<Value>>() { 
        @Override 
        public List<Value> get() { 
         return Lists.newArrayList(); 
        } 
       }); 

क्योंकि जावा अगर Maps.newHashMap समर्थन नक्शे के लिए प्रयोग किया जाता है सही प्रकार अनुमान नहीं लगा सकता। बेशक, इसे एक अलग विधि में दोबारा क्रियान्वित किया जा सकता है, लेकिन क्या यह पहले से ही इसे अधिक संक्षेप में लिखने का एक तरीका है?

उत्तर

49

आप इतने साधारण मामले के लिए ArrayListMultimap.create() का उपयोग क्यों नहीं कर रहे हैं? सरल हैश मैप/ऐरेलिस्ट बनाने का यह डिफ़ॉल्ट तरीका है जो शायद सबसे आम प्रयुक्त मल्टीमैप है।

+2

मुझे लगता है कि आपका मतलब 'ArrayListMultimap' है।'हैशमल्टीमाप' हैश मैप '/ 'हैशसेट' के लिए है। –

+0

हां, मेरा मतलब है ArrayListMultimap। संपादन के लिए धन्यवाद। –

+3

क्योंकि मैं गलत वर्ग ('Multimaps') :) –

2

मूल प्रकार अनुमान समस्या का उत्तर देने के लिए, आप Maps.<Key, Collection<Value>>newHashMap() का उपयोग करके स्थिर विधि पर जेनेरिक प्रकार भी निर्दिष्ट कर सकते हैं, लेकिन यह निश्चित रूप से new HashMap<Key, Collection<Value>>() (यह अधिक संगत हो सकता है) से अधिक संक्षिप्त नहीं है।

7

मैं ग्राहकों को लिखते समय और प्रश्न पैरा के मानचित्र बनाने के दौरान इस समस्या में भाग लेता हूं। एक अच्छा संक्षिप्त पैटर्न मैं multimaps के निर्माण के लिए की तरह जावा 8 में ImmutableMultiMap#builder

Multimap<String, String> queryParams = 
    ImmutableMultimap.<String, String>builder() 
    .put("key-1", "value-1") 
    .put("key-1", "value-2") 
    .build(); 
3

उपयोग करने के लिए यह बहुत अच्छा है multimaps के सभी प्रकार के लिए, है। यह दो कारणों से है:

  • क्योंकि संकलक target types for type inference का उपयोग करता है, तो आप HashMap contructor के लिए स्पष्ट प्रकार तर्क प्रदान करने के लिए नहीं है।
  • Constructor method references का उपयोग ArrayList फैक्टरी बनाने के लिए किया जा सकता है।

यह इस तरह दिखता है:

Multimap<Integer, String> multi = HashMultimap.create(); 
4

यहाँ कॉम्पैक्ट समाधान है नीचे प्रस्तुत विभिन्न रूपों के पक्ष में, और इसलिए टालना चाहिए।

अमरूद 21.0 बाद, एक Multimap वस्तु जहां मूल्यों ArrayList संग्रह में जमा हो जाती है बनाने की सिफारिश की जिस तरह से है निम्नलिखित:

MultimapBuilder.hashKeys().arrayListValues().build(); 

अगर आप अपेक्षित संख्या में निर्दिष्ट करना चाहते हैं तुम भी मानकों का उपयोग कर सकते अपने नक्शे में कुंजी और कुंजी प्रति मूल्यों की अपेक्षित संख्या की:

MultimapBuilder.hashKeys(expectedKeys).arrayListValues(expectedValuesPerKey).build(); 

अंत में, आप एक अस्तित्व से एक नया Multimap बना सकते हैं इस संरचना का उपयोग करते हुए एक ing:

MultimapBuilder.hashKeys().arrayListValues().build(multimap); 

आप अपने Multimap में ArrayLists के अलावा अन्य डेटा संरचनाओं का उपयोग करना चाहते हैं, तो आप अन्य लोगों की एक संख्या से arrayListValues() करने के लिए कॉल जगह ले सकता है, here सूचीबद्ध।

6

Guava documentation कहा गया है कि create विधि कुछ अन्य उत्तर द्वारा की वकालत "शीघ्र ही हटा दिया जाएगा":

Multimap<Key, Value> providersToClasses = 
    Multimaps.newListMultimap(new HashMap<>(), ArrayList::new); 
संबंधित मुद्दे