2008-10-26 8 views
8

एकजावा तुलनाकारी

public Comparator getComparatorForClass(Class clazz) {} 

यह स्ट्रिंग, डबल, पूर्णांक की तरह सामान के लिए कॉम्पैरेटर वापसी होगी साथ, जावा में तुलनाकारी कारखाने के कुछ प्रकार के किसी भी एक पता है, लेकिन एक

public void addComparatorForClass(Class clazz, Comparator comparator) {} 

होता मनमाना प्रकार के लिए।

factory.getComparatorForClass(x.getClass()).compare(x, y) 

आप बस Comparable को लागू करने और लिख सकते हैं::

x.compareTo(y) 

स्ट्रिंग, आदिम रैपर, और मानक संग्रह पहले से ही Comparable लागू

+1

तुलनात्मक उपयोग करना अच्छा विकल्प है। इस तरह के कारखाने में सामान्य रूप से कोई मतलब नहीं है। –

+0

कक्षाओं के लिए यह क्या होगा जिसमें एक से अधिक तुलनाकर्ता हैं? उदा।, एक कर्मचारी जिसे नाम या आईडी द्वारा क्रमबद्ध किया जा सकता है? –

उत्तर

4

मुझे अपने सिर के ऊपर से कुछ भी पता नहीं है। यदि आपको वास्तव में ऐसा कुछ चाहिए, तो इसे स्वयं को लागू करना बहुत मुश्किल नहीं होना चाहिए।

हालांकि, क्या आप इस बारे में विस्तार से बता सकते हैं कि आपको ऐसा कुछ क्यों चाहिए? कक्षाओं के लिए आम तौर पर "डिफ़ॉल्ट" तुलनित्र नहीं होना चाहिए। यदि कक्षा में कुछ प्रकार के प्राकृतिक आदेश हैं, तो आपको वास्तव में इसे java.lang.Comparable लागू करना चाहिए, और इसके बजाय Comparable#compareTo(Object) : int लागू करना चाहिए।

http://java.sun.com/j2se/1.4.2/docs/api/java/lang/Comparable.html

10

कॉमन्स लैंग से उपयोग CompareToBuilder

Comparable.compareTo (वस्तु) के तरीकों को लागू करने में सहायता करता है। इन विधि में ..

public class MyClass { 
    String field1; 
    int field2; 
    boolean field3; 

    ... 

    public int compareTo(Object o) { 
    MyClass myClass = (MyClass) o; 
    return new CompareToBuilder() 
     .appendSuper(super.compareTo(o) 
     .append(this.field1, myClass.field1) 
     .append(this.field2, myClass.field2) 
     .append(this.field3, myClass.field3) 
     .toComparison(); 
    } 
} 
1

तुलनाकारी का विस्तार .. यह पुन: प्रयोज्य कोड कार्यान्वयन पर आधारित है होने की जरूरत नहीं है तुम में से एक कस्टम तुलना कर सकते हैं:

इस प्रकार इस वर्ग लिखने कोड का उपयोग करने के डेटा .. कार्यान्वयन सिर्फ सरल है .. बस तुलनात्मक इंटरफ़ेस को कार्यान्वित करें .. इसकी तुलना विधि को ओवरराइड करें और तुलना कोड रखें .. और जो आपको लगता है वह मानों के संदर्भ में अधिक है ..

0

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

उदाहरण:

वर्ग खोजकर्ता> { निजी तुलनाकारी तुलनित्र;

Searcher(Comparator<T> comparator) { 
    this.comparator = comparator; 
} 

Searcher() { 
    this(new DefaultComparator<T>()); 
} 

int search(...) { 
    ... 
} 

private static class DefaultComparator<E extends Comparable<E>> 
     implements Comparator<E> { 
    public int compare(E o1, E o2) { 
     return o1.compareTo(o2); 
    } 
}