2010-06-02 13 views
5

से जावा में डायरेक्ट तुलनित्र मेरे पास एक विधि है जिसके लिए इसके पैरामीटर में से एक के लिए Comparator की आवश्यकता है। मैं Comparator पास करना चाहता हूं जो सामान्य तुलना करता है और रिवर्स तुलनित्र जो विपरीत में करता है।बॉक्स में

java.util.CollectionsreverseOrder() प्रदान करता है यह विपरीत तुलना के लिए अच्छा है, लेकिन मुझे कोई सामान्य Comparator नहीं मिला।

मेरे दिमाग में जो एकमात्र समाधान आया वह Collections.reverseOrder(Collections.reverseOrder()) है। लेकिन मुझे यह पसंद नहीं है क्योंकि डबल विधि अंदर कॉल कर रही है।

बेशक मैं एक NormalComparator इस प्रकार लिख सकते:

public class NormalComparator<T extends Comparable> implements Comparator<T> { 
    public int compare(T o1, T o2) { 
     return o1.compareTo(o2); 
    } 
} 

लेकिन मैं वाकई हैरान है कि जावा बॉक्स से बाहर इस के लिए एक समाधान नहीं है हूँ।

उत्तर

6

अधिकांश स्थानों पर जहां आप एक Comparator निर्दिष्ट कर सकते हैं भी सब पर जिस स्थिति में यह स्वाभाविक क्रम का उपयोग करता है एक Comparator का उपयोग किए बिना एक संस्करण है (यानी यह सभी वस्तुओं Comparable को लागू करने की उम्मीद है और compareTo उपयोग करता है)।

तो इसका सामान्य समाधान Comparator बिल्कुल निर्दिष्ट नहीं करना है। क्या आपके पास एक विशिष्ट मामला है जहां केवलComparator दृष्टिकोण समर्थित है?

आप पूरी तरह उसकी आवश्यकता है, Google Collections (और साथ ही Guava, जो गूगल संग्रह का सुपरसेट है) Ordering.natural() जो a Ordering object कि प्राकृतिक व्यवस्था का प्रतिनिधित्व के रूप में Comparable इंटरफ़ेस द्वारा परिभाषित रिटर्न प्रदान करता है। OrderingComparator लागू करता है, ताकि आप इसका उपयोग कर सकें।

+0

यह मेरी विधि है इसलिए इसका प्राकृतिक क्रम नहीं है। (असल में यह है, क्योंकि मैंने इसे काम करने के लिए लिखा था, लेकिन मैं नहीं चाहता था, मैं एक अच्छे समाधान की तलाश में हूं) –

+0

और हाँ, मैंने इसे लिखा क्योंकि मैंने 'हैश्री' के स्रोत को देखा। –

+0

@ करासाज़ी: जो 'हैश्री' क्या आप बात कर रहे हैं? जावा एसई में ऐसी कोई कक्षा नहीं है। क्या आपका मतलब 'ट्रीमैप' था? –

0

रिवर्स आदेश उपयोग Collections.reverseOrder() के लिए ...

एक तुलनित्र है कि वस्तुओं कि तुलनीय इंटरफ़ेस को लागू की एक संग्रह पर प्राकृतिक आदेश के विपरीत लगाता देता है।

+0

आपको प्रश्न समझ में नहीं आया। मैं सिर्फ एक विपरीत चाहता हूं, न केवल विपरीत। डबल रिवर्स सामान्य –

+0

@ István हो सकता है: प्राकृतिक क्रम के लिए तुलनात्मक वस्तुओं के लिए सरल प्राकृतिक कॉम्पैक्टर लागू करना। मैं मानक पुस्तकालयों में से एक नहीं ढूंढ सकता। –

+0

यह ओपी में था, क्योंकि आप –

0

, आमतौर पर एक प्राकृतिक व्यवस्था Comparator<T> के लिए कोई जरूरत नहीं है आमतौर पर वहाँ एक अधिभार है कि एक Comparable<T> ले जाता है के बाद से। तुम हमेशा Collections.reverseOrder() द्वारा उदाहरण स्थापित का पालन करें और कुछ इस तरह लिख सकते हैं:

private static final Comparator<?> NATURAL_ORDER = 
    new Comparator<Comparable<Object>>() { 
    @Override public int compare(Comparable<Object> o1, Comparable<Object> o2) { 
     return o1.compareTo(o2); 
    } 
    }; 

@SuppressWarnings("unchecked") 
public static <T> Comparator<T> naturalOrder() { 
    return (Comparator<T>) NATURAL_ORDER; 
} 

फिर आप की तरह कुछ लिख सकते हैं:

List<String> names = Arrays.asList("Bob", "Alice", "Carol"); 
Collections.sort(names, naturalOrder()); 
System.out.println(names); 
// prints "[Alice, Bob, Carol]" 
+0

जैसा कि आप ओपी में देख सकते थे, मैंने यही किया! –

1

लेकिन मैं वाकई हैरान जावा नहीं है कि कर रहा हूँ बॉक्स के बाहर इसके लिए एक समाधान।

मुझे लगता है कि यह कुछ मामलों में उपयोगी होगा ... आपकी तरह। लेकिन में उपयोग-मामलों में एक एप्लिकेशन सीधे ऑब्जेक्ट की compareTo विधि का उपयोग करेगा।Comparator ऑब्जेक्ट के माध्यम से अप्रत्यक्ष करने से कोई उद्देश्य नहीं होगा ... अधिकांश समय।

मेरा अनुमान है कि उन जावा एपीआई के डिजाइनरों ने आपके उपयोग-मामले को सीधे समर्थन करने के लिए पर्याप्त महत्वपूर्ण नहीं माना। इसके अलावा, आपका कार्यान्वयन कोड की केवल चार पंक्तियां हैं।

जावा क्लास लाइब्रेरी सही नहीं हैं। इसके साथ रहने के लिए जानें :-)।

+0

और वे प्रत्येक विधि में 'शून्य' को स्वीकार करते हैं जहां 'तुलनाकर्ता' की आवश्यकता होती है (और उन्होंने 'नया' प्राकृतिक 'बनाने के बजाय' तुलनात्मक विधि 'चिपकाया), इसलिए वास्तव में ** DRY ** समाधान नहीं है। मुझे लगता है ... –