2012-08-01 4 views
37

मान लीजिए कि हम आइटम का संग्रह करते हैं Ordering, मुझे लगता है)। मेरा मतलब है इस ग्रोवी कोड के समान कुछ:अमरूद में सूची से अधिकतम() तत्व प्राप्त करने के लिए कैसे

list.max{it.price} 

मैं यह कैसे कर सकता हूं? यह कितना कुशल है?

उत्तर

55
Ordering<Item> o = new Ordering<Item>() { 
    @Override 
    public int compare(Item left, Item right) { 
     return Ints.compare(left.price, right.price); 
    } 
}; 
return o.max(list); 

यह के रूप में यह हो सकता है के रूप में कुशल है: यह सूची के आइटम के माध्यम से iterates, और रिटर्न अधिकतम कीमत होने आइटम के पहले: हे (एन)।

+0

यदि कीमत int नहीं है। इस दृष्टिकोण का उपयोग करने के लिए अमरूद में हैं? – gstackoverflow

+0

कीमत का प्रकार अप्रासंगिक है। आपको बस एक आदेश प्रदान करने की आवश्यकता है जो वस्तुओं की कीमत से तुलना करता है। आइए मान लें कि यह बिगडिसीमल है, आप 'वापसी left.price.compareTo (right.price)' का उपयोग करेंगे। –

34

जेबी के जवाब के अनुसार, आप भी कुछ आशुलिपि जब, मूल्यों जो प्राकृतिक व्यवस्था है के साथ काम कर उदाहरण के लिए उपयोग कर सकते हैं:

Ordering.<Integer> natural().max(listOfIntegers); 

जानकारी के लिए Ordering.natural() देखें।

11

आप इसे अमरूद के बिना कर सकते हैं।

संग्रह min और max विधियों को प्रदान करता है जो किसी संग्रह पर संचालित होते हैं, जिसमें तुलनित्रों को अधिभारित करना शामिल है। यहाँ हम एक लैम्ब्डा के साथ जावा 8 तुलनाकारी स्थिर तरीकों का उपयोग संक्षेप में एक तुलनित्र निर्दिष्ट करने के लिए, लेकिन जावा 8 इससे पहले कि आप एक अनाम वर्ग का उपयोग कर सकते हैं:

Item max = Collections.max(list, Comparator.comparingInt(i -> i.price)); 

इन विधियों NoSuchElementException फेंक देंगे अगर संकलन रिक्त है।


जावा 8 धाराओं min और max कार्यों एक तुलनित्र लेने प्रदान करते हैं। स्ट्रीम को रिक्त रूप से संभालने के लिए ये फ़ंक्शन Optional<T> लौटते हैं। तुलनात्मक में स्थैतिक विधियां प्राकृतिक क्रम के सामान्य मामले सहित तुलनात्मक रूप से निर्दिष्ट करने के लिए उपयोगी हैं। इस सवाल के लिए, आप

Optional<Item> max = list.stream().max(Comparator.comparingInt(i -> i.price)); 

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

(एक तरफ:। आदर्श स्ट्रीम min और max भार के कोई तर्क लेने प्रदान करेगा जब स्ट्रीम प्रकार तुलनीय लागू करता है दुर्भाग्य से जावा सशर्त एक प्रकार पैरामीटर के आधार पर उजागर तरीकों का समर्थन नहीं करता है, और यह एक नया StreamOfComparable शुरू करने के लायक नहीं है इंटरफ़ेस केवल इस मामले के लिए स्ट्रीम का विस्तार कर रहा है।)

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