2012-02-28 17 views
20

में अपने सामान्य अनुबंध का उल्लंघन करती है मुझे जावा 7 में कुछ जावा कोड संकलित करने के बाद "इसके सामान्य अनुबंध का उल्लंघन" मिल रहा है, और फिर इसे चला रहा है।तुलना विधि जावा 7

मैंने Comparison method violates its general contract! Java 7 only पढ़ा है और मुझे पता है कि मेरे कोड के साथ कुछ गलत है जिसे जावा के पिछले संस्करणों में अनदेखा किया गया था। हालांकि मैं अपने कोड के साथ क्या गलत काम नहीं कर सकता। Collections.sort() त्रुटि उत्पन्न करता है।

मेरे कोड है:

public Comparator sortBySmoothDays() { 
    Comparator c = new Comparator() { 
     public int compare(Object arg0, Object arg1) { 
      Date date0 = ((PosObject)arg0).getDate(); 
      Date date1 = ((PosObject)arg1).getDate(); 

      double d1 = MyUtils.calcSmoothDays(date0, new Date()); 
      double d2 = MyUtils.calcSmoothDays(date1, new Date()); 
      if (d1 >= d2) { 
       return 1; 
      } 
      else { 
       return -1; 
      } 
     } 
    }; 
    return c; 
} 


Comparator c = ComparatorUtils.getInstance().sortBySmoothDays(); 
Collections.sort(posList, c); 

किसी को भी मदद कर सकते हैं? धन्यवाद!

+0

JFI: इस अपवाद फेंकने के लिए एक नया Java7 सुविधा है। पुराने व्यवहार को एक नई सिस्टम प्रॉपर्टी के साथ कॉन्फ़िगर किया जा सकता है: java.util.Arrays.useLegacyMergeSort http://stackoverflow.com/a/8417446/450812 – alfonx

उत्तर

31

एक तुलनित्र 0 लौटना चाहिए अगर मान बराबर हैं। आपके वर्तमान कार्यान्वयन में, यदि वे बराबर हैं तो आप 1 लौटाते हैं। अपने double मूल्यों को सही ढंग से तुलना करने के लिए सबसे आसान तरीका है Double.compare कॉल करने के लिए है:

double d1 = MyUtils.calcSmoothDays(date0, new Date()); 
double d2 = MyUtils.calcSmoothDays(date1, new Date()); 

return Double.compare(d1, d2); 
+0

बहुत बहुत धन्यवाद! – gordon613

+0

यह 1, -1 नहीं देता है। – xehpuk

+0

@xehpuk आप सही हैं। मैंने ठीक कर दिया। –

19

आपके तुलनित्र के साथ, प्रत्येक वस्तु स्वयं से अधिक की तुलना करती है: हमेशा एक देता है।

यह निम्न requirement उल्लंघन करती है:

implementor कि sgn (तुलना (एक्स, वाई)) == -sgn (तुलना (y, x)) सब x और y के लिए यह सुनिश्चित करना चाहिए।

उपरोक्त आवश्यकता का तात्पर्य है कि शून्य वापस करना होगा।

मैं contract पढ़ने और यह सुनिश्चित करने की सिफारिश करता हूं कि आपका कार्यान्वयन इसे पूरा करेगा।

विशेष रूप से, यदि date0.equals(date1), तो तुलनित्र को किसी भी फ़्लोटिंग-पॉइंट रूपांतरण और तुलना किए बिना, तुरंत शून्य वापस लौटना चाहिए।

+0

अधिक आम तौर पर, इस विधि का उपयोग करके कोई भी दो वस्तुएं एक-दूसरे के बराबर नहीं हो सकती हैं । कोई कोड पथ नहीं है जो 0 (या बराबर) परिणाम उत्पन्न करता है। –

+0

बहुत बहुत धन्यवाद! – gordon613

3

यह मुद्दा नहीं है कि यदि दो ऑब्जेक्ट बराबर i.e. calcSmoothDays समान मान देता है, तो आप एक ऐसी स्थिति हो सकती है जहां तुलना करें (object1, object2) == 1, और तुलना करें (object2, object1) == 1 भी?

तो यह संकेत मिलता है कि object1> वस्तु 2 और object2> वस्तु 1 ...

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