2013-08-25 5 views
8

मेरे पास कस्टम ऑब्जेक्ट्स के साथ एक ऐरेलिस्ट है। उनमें एक चेकबॉक्स ऑब्जेक्ट होता है जिसे मैं सॉर्ट करना चाहता हूं। मैं इस तुलनित्र फ़ंक्शन का उपयोग करने के लिए इसका उपयोग कर रहा हूं:जावा में बूलियन का उपयोग करके ArrayLists को कैसे क्रमबद्ध करें?

मैं एक्सओआर ऑपरेटर का उपयोग यह जांचने के लिए कर रहा हूं कि वे एक-दूसरे के बराबर हैं या नहीं, फिर इसे अस्वीकार करें।

हालांकि यह काम नहीं कर रहा है, और सूची एक ही क्रम में रह रही है।

क्या किसी को पता है कि क्या गलत है?

public class CustomSelectSort implements Comparator<ObjPerson> { 
    @Override 
    public int compare(ObjPerson o1, ObjPerson o2) { 
     return !(o1.select.isChecked()^o2.select.isChecked()) ? 1 : -1; 
    } 
} 
+0

आप दिखा सकते हैं जहां तरह कॉल कर रहे हैं? – Kon

+0

क्या आपने bitwise मैनिपुलेशन के बजाय '! =' का उपयोग करने का प्रयास किया है? –

+2

ठीक है, यह स्पष्ट रूप से काम नहीं करेगा जब 'सत्य, झूठी' 'झूठी, सत्य' जैसा ही है। (मान लीजिए कि आप 'सत्य' और 'झूठी' को अलग करने के लिए सॉर्ट कर रहे हैं) – Zong

उत्तर

19

आप केवल -1 (कम से कम) या +1 (से अधिक), कभी नहीं 0 (के बराबर) लौट आते हैं।

java.util.Comparator definition देखें:

आदेश के लिए अपने दो तर्क तुलना करता है। एक नकारात्मक पूर्णांक देता है, शून्य, या पहले पूर्ण तर्क के रूप में एक सकारात्मक पूर्णांक, के बराबर या दूसरे से अधिक है।

पूर्वगामी वर्णन में, अंकन sgn (अभिव्यक्ति) निर्दिष्ट करता है जिनकी गणितीय Signum समारोह है, जो परिभाषित किया गया है -1 में से एक, 0, या 1 वापस जाने के लिए है कि क्या अभिव्यक्ति के मूल्य नकारात्मक, शून्य या सकारात्मक है अनुसार ।

कार्यान्वयनकर्ता को यह सुनिश्चित करना चाहिए कि sgn (तुलना करें (x, y)) == -sgn (तुलना करें (y, x)) सभी एक्स और वाई के लिए। (यह है कि (एक्स, वाई) की तुलना यदि और केवल यदि तुलना (y, x) एक अपवाद फेंकता एक अपवाद फेंक चाहिए निकलता है।)

implementor भी सुनिश्चित करना चाहिए कि संबंध सकर्मक है: ((तुलना (एक्स, वाई)> 0) & & (तुलना करें (वाई, जेड)> 0)) तुलना (x, z)> 0 की तुलना करें)।

अंत में, कार्यान्वयनकर्ता को यह सुनिश्चित करना चाहिए कि तुलना करें (x, y) == 0 का अर्थ है जो sgn (तुलना (x, z)) == sgn (तुलना करें (y, z)) सभी z के लिए।

यह आमतौर पर मामला है, लेकिन सख्ती से इसकी आवश्यकता नहीं है (तुलना करें (x, y) == 0) == (x.equals (y))। आम तौर पर, किसी भी तुलनित्र इस स्थिति का उल्लंघन करता है स्पष्ट रूप से इस तथ्य को इंगित करना चाहिए। अनुशंसित भाषा है "नोट: यह तुलनित्र आदेशों को लागू करता है कि बराबर के साथ असंगत हैं।"

प्रस्ताव जावा 1.7 से पहले:

public int compare(ObjPerson o1, ObjPerson o2) { 
    boolean b1 = o1.select.isChecked(); 
    boolean b2 = o2.select.isChecked(); 
    if(b1 && ! b2) { 
     return +1; 
    } 
    if(! b1 && b2) { 
     return -1; 
    } 
    return 0; 
} 

प्रस्ताव since Java 1.7:

public int compare(ObjPerson o1, ObjPerson o2) { 
    boolean b1 = o1.select.isChecked(); 
    boolean b2 = o2.select.isChecked(); 
    return Boolean.compare(b1, b2); 
} 
+0

पोस्ट संपादित क्योंकि जावा 1।7 कक्षा बूलियन – Aubin

+0

में एक स्थिर बूलियन तुलनित्र जोड़ता है, बूलियन बी 1 और बी 2 को बूलियन बी 1 और बी 2 में बदल दिया है, क्योंकि बूलियन बुलेन द्वारा प्रदान किए गए कार्यों की तुलना नहीं करता है। – AkashG

+0

@AkashG: Boolean.compare के साथ स्पष्ट कॉल का उपयोग किया जाता है, यहां कोई अनुमान नहीं दिया जाता है। Http://docs.oracle.com/javase/8/docs/api/java/lang/Boolean.html#compare-boolean-boolean- – Aubin

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