2011-06-04 14 views
17

क्या कोई अंतर्निहित विधि या तरीकों का संयोजन है जो भविष्यवाणियों का उपयोग करके गुवा इम्युटेबल मल्टीमैप्स के फ़िल्टर किए गए दृश्य को वापस करने के लिए है, जैसे आप नियमित मानचित्रों के साथ कर सकते हैं?फ़िल्टरिंग गुवा मल्टीमैप्स

मैप्स.फिल्टर विधि प्रतीत नहीं होता है जो एक अपरिवर्तनीय मल्टीमैप को पैरामीटर के रूप में स्वीकार करता है। एपीआई को देखते हुए मैं asMap() को कॉल कर सकता हूं और मल्टीमैप का नक्शा आधारित दृश्य प्राप्त कर सकता हूं और फ़िल्टर को इस तरह से कर सकता हूं। हालांकि, मुझे अपने फ़ंक्शन से एक अपरिवर्तनीय मल्टीमैप वापस करने की आवश्यकता है और स्पष्ट कारणों से मैप को एक अपरिवर्तनीय मल्टीमैप के रूप में देखने का कोई तरीका नहीं है - बिना किसी नए मल्टीमैप को नियंत्रित किए।

भले ही मैं इसे मानचित्र के रूप में फ़िल्टर कर सकता हूं और इसे वापस एक इमटेबल मल्टीमैप पर डाल सकता हूं क्योंकि वे सभी विचार हैं (मुझे लगता है?), फ़िल्टर विधियां केवल मुझे व्यक्तिगत रूप से संग्रह को फ़िल्टर करने देंगी ।

+0

में अमरूद को जोड़ा गया है आप कुंजी या मूल्यों पर फिल्टर करने के लिए देख रहे हैं? –

+0

मुझे वास्तव में दोनों पर फ़िल्टर करने की आवश्यकता है। एक उदाहरण में केवल चाबियों पर, दूसरी कुंजी और एक मूल्य पर। – broconne

+0

कुछ विचार प्राप्त करने के लिए http://stackoverflow.com/questions/6176918/google-collections-guava- पुस्तकालय-immutableset-list-map-and-filtering देखें। – Istao

उत्तर

1
public static <Type1, Type2> ImmutableMultimap<Type1, Type2> dFilter(
     ImmutableMultimap<Type1, Type2> data,// 
     Predicate<Type1> predicate// 
) { 
    Multimap<Type1, Type2> result = HashMultimap.create(); 
    for (Type1 t1 : data.keys()) 
     if (predicate.apply(t1)) 
      for (Type2 t2 : data.get(t1)) 
       result.put(t1, t2); 

    return ImmutableMultimap.copyOf(result); 
} 

वहाँ एक अंतर्निहित विधि है ...

सं

+0

कोड स्निपेट के लिए धन्यवाद। यह अनिवार्य रूप से मैं क्या कर रहा था, लेकिन मैंने इसके बजाय ImmutableMultiMap बिल्डर का उपयोग किया, इसलिए मुझे एक नक्शा बनाने की आवश्यकता नहीं थी और फिर इसे एक अपरिवर्तनीय मानचित्र के रूप में पुन: बनाना था। – broconne

0

प्रतिबिंब पर, मुझे नहीं लगता कि वहाँ के लिए एक ImmutableMultimap के फ़िल्टर किए गए दृश्य बनाने के लिए एक रास्ता है एक बहुत अच्छा कारण है। यदि कोई ऑब्जेक्ट एक ImmutableMultiMap की अपेक्षा करता है, तो यह ऑब्जेक्ट के ऑब्जेक्ट के लिए उस ऑब्जेक्ट को बदलने के लिए प्रतीत नहीं होता है। फ़िल्टर को लागू करना, जो गतिशील रूप से संचालित हो सकता है, उस अंतर्निहित (या संभवतः मुझे पता है कि सभी के लिए लिखित) अनुबंध तोड़ देगा क्योंकि ऐसा लगता है कि नक्शा वास्तव में उत्परिवर्तित विभिन्न तरीकों से कॉल के बीच है।

4

पूर्ण अपरिवर्तनीय मल्टीमैप की प्रतिलिपि बनाने के बजाय, आप फॉरवर्डिंग मल्टीमैप का उपयोग करने की कोशिश करते हैं और नक्शा पूछे जाने पर फ़िल्टर लागू करते हैं, उदाहरण के लिए

@Override 
public boolean containsKey(@Nullable Object key) { 
    if (!keyFilter.apply(key)) 
    return false; 
    return super.containsKey(key); 
} 

@Override 
public boolean containsEntry(@Nullable Object key, @Nullable Object value) { 
    .. 
} 

@Override 
public Collection<V> get(@Nullable K key) { 
    if (!keyFilter.apply(key)) 
    return Collections.emptyList(); 
    return Collections2.filter(delegate().get(key), valueFilter); 
} 

और इसी तरह।

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