2012-02-06 33 views
9

मैंने Comparable इंटरफ़ेस के बारे में सीखा, जिसके लिए एक वर्ग को compareTo विधि लागू करना आवश्यक है। एक परियोजना मुझे लगता है कि विधि का उपयोग कर रहा है:क्या org.apache.commons.lang.builder.CompareToBuilder वास्तव में करता है?

public class EmployeeAssignmentTotal implements Comparable<EmployeeAssignmentTotal>, Serializable { 

private Employee employee; 
private int total; 
.... 
public int compareTo(EmployeeAssignmentTotal other) { 
    return new CompareToBuilder() 
      .append(employee, other.employee) 
      .append(total, other.total) 
      .toComparison(); 
} 

क्या exacly CompareToBuilder यहां क्या करता है? और यह employee और total विशेषताओं के साथ कैसे सहभागिता कर रहा है?


मैं the javadocs पढ़ा था, लेकिन मैं नहीं कर सकते सिर या क्या वे निर्माता और कई append के साथ कर रहे हैं की पूंछ बनाते हैं। क्या यह प्रश्न अस्पष्ट इरादे और शून्य शोध को इंगित करता है?

+3

क्या जावाडोक (http://commons.apache.org/lang/api-2.4/org/apache/commons/lang/builder/CompareToBuilder.html) किसी तरह से अस्पष्ट है? – skaffman

+2

यह कई तरीकों से अस्पष्ट है। विशेष रूप से परिणामस्वरूप इंटीजर की गणना कैसे की जाती है या कैसे अनुक्रम का अनुक्रम वापसी मूल्य को प्रभावित करता है। –

+2

मुझे यह बेहद जानकारीपूर्ण पोस्ट मिला - http://www.codejava.net/java-core/collections/sorting-a-list-by-multiple-attributes-example – Shatu

उत्तर

4

यह कक्षा compareTo() -methods बनाने में आपकी सहायता करने के लिए है। कल्पना करें कि आपके वर्ग में केवल 2 फ़ील्ड से अधिक थे - मैन्युअल रूप से आपकी तुलना-कोडिंग कोडिंग काफी बोझिल हो सकती है।

तुलना टॉबिल्डर आपके लिए ऐसा कर रहा है - प्रत्येक append() विधि एक नई तुलना जोड़ रही है, और सभी तुलना && एड हैं।

तो आपके द्वारा पोस्ट किया गया कोड कर्मचारी ऑब्जेक्ट पर equals() चलाता है और total पर चलता है।

10

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

तो मेरा सवाल यह था कि गुणों को जोड़ने का क्रम तुलना को कैसे प्रभावित करता है। इसका उत्तर देने के लिए, केवल एक चीज मैं कर सकता स्रोत कोड की जांच की थी और मैं इस पाया:

public CompareToBuilder append(int lhs, int rhs) { 
    if (this.comparison != 0) { 
     return this; 
    } 
    this.comparison = ((lhs > rhs) ? 1 : (lhs < rhs) ? -1 : 0); 
    return this; 
} 

तो, मूल रूप से क्या हो रहा है कि यह आदेश आप उन्हें संलग्न के आधार पर विशेषताओं की तुलना करेंगे है। आपके कोड उदाहरण में, "कर्मचारी" का मूल्यांकन पहले किया जाएगा। यदि बाएं हाथ की विशेषताएँ कम से कम या उससे अधिक के रूप में मूल्यांकन करती हैं तो दाएं हाथ की ओर, कुल अवहेलना की जाती है।

विशेषता "कुल" का मूल्यांकन केवल तभी किया जाएगा जब "कर्मचारी" बराबर मूल्यांकन करता है।

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