2012-06-27 32 views
7

मैं गूगल अमरूद 12 का उपयोग कर रहा है और एक नक्शा है:मैं प्रविष्टियों का सेट के आधार पर फ़िल्टर कर सकते हैं कैसे नक्शा प्रविष्टियों

Set<OccupancyType> policy; 

मैं प्रविष्टियों कैसे फ़िल्टर कर सकते हैं:

Map<OccupancyType, BigDecimal> roomPrice; 

मैं एक सेट है roomPrice map पर policy पर आधारित और फ़िल्टर किए गए मानचित्र को वापस करें?

filteredMappolicy से सभी मानों की आवश्यकता है। यदि कक्षप्रकाश मानचित्र में नीति से कोई प्रविष्टि नहीं है, तो मैं इसके बजाय डिफ़ॉल्ट मान इनपुट करना चाहता हूं।

उत्तर

27

चूंकि आपके पास चाबियों का एक सेट है, इसलिए आपको Maps.filterkeys() का उपयोग करना चाहिए, यह भी गुवा भविष्यवाणी का एक बहुत अच्छा सेट प्रदान करता है कि आप बॉक्स से बाहर उपयोग कर सकते हैं। आपके मामले में Predicates.in() जैसे कुछ काम करना चाहिए।

Map<OccupancyType, BigDecimal> filteredMap 
    = Maps.filterKeys(roomPrice, Predicates.in(policy)); 

आशा है कि यह मदद करता है:

तो बुनियादी तौर पर आप के साथ खत्म।

+0

धन्यवाद! मैं अभी भी भविष्यवाणियों के लिए बहुत नया हूं और यह सुनिश्चित नहीं करता कि यह एक भविष्यवाणी कैसे उत्पन्न करेगा जो मेरे मानचित्र पर काम करेगा। इसके अलावा, यह सुनिश्चित करने का कोई तरीका है कि फ़िल्टर किए गए मैप में पॉलिसी से सभी मूल्य हो सकते हैं। यदि कक्षप्रकाश मानचित्र में नीति से कोई प्रविष्टि नहीं है, तो मैं इसके बजाय डिफ़ॉल्ट मान इनपुट करना चाहता हूं। – brainydexter

+0

यदि आपके पास "डिफ़ॉल्ट" प्रविष्टियों वाला नक्शा है तो आप कुछ ऐसा कर सकते हैं: filteredMap.putAll (Maps.difference (filteredMap, defaultMap) .entriesOnlyOnRight()); –

+1

इसके अलावा, आप इस आलेख को देख सकते हैं: http://scaramoche.blogspot.de/2010/08/googles-guava-library-tutorial-part-4।एचटीएमएल इसमें भविष्य के उपयोग के कुछ अच्छे उदाहरण हैं। –

2
  • अवहेलना और OccupancyType में equals और hashcode लागू।
  • roomPrice की कीसेट के माध्यम से लूप और फ़िल्टर में निहित तत्व एकत्र करें।

कुछ इस तरह:

Map<OccupancyType, BigDecimal> filteredPrices = new HashMap<OccupancyType, BigDecimal>(); 
for(OccupancyType key : roomPrice.keySet()) { 
    if(policy.contains(key) { 
     filteredPrices.put(key, roomPrice.get(key)); 
    } 
} 

अद्यतन

Ok Google अमरूद पर थोड़ा पढ़ने के बाद, आप की तरह कुछ करने के लिए सक्षम होना चाहिए:

Predicate<OccupancyType> priceFilter = new Predicate<OccupancyType>() { 
    public boolean apply(OccupancyType i) { 
     return policy.contains(i); 
    } 
}; 

और फिर

return Maps.filterValues(roomPrice, priceFlter); 

चाल करना चाहिए।

+0

धन्यवाद! मुझे पता है कि काम करेगा, लेकिन मैं अमरूद का उपयोग करना सीख रहा हूं। मैं कुछ प्रकार के मानचित्रों का उपयोग करने की उम्मीद कर रहा था। फिटर एंटररीज (...) [लिंक] (http://docs.guava-libraries.googlecode.com/git-history/release/javadoc/com/google/common/ Google- guava से/maps.html # filterEntries (java.util.Map, com.google.common.base.Predicate) एकत्र करें) [/ link]। क्या आपको कोई विचार होगा कि मैं इसके साथ उपरोक्त कैसे कर सकता हूं? – brainydexter

+0

ठीक है, मैंने इसे पढ़ने के बाद अपना जवाब अपडेट कर दिया है, अगर यह काम करता है तो मुझे बताएं! – Jeshurun

+0

आपको नहीं लगता कि यह 'Maps.filterEntries (roomPrice, priceFilter) होना चाहिए;' – brainydexter