2015-06-14 7 views
5

मैं तुलनात्मक इंटरफ़ेस का उपयोग करके मानक तुलना से परिचित हूं, हालांकि आज मुझे कई परेशानी हो रही है जब मैं कई अलग-अलग चर की तुलना करना चाहता हूं।विभिन्न चरों की तुलना करने के लिए तुलनीय उपयोग

if (o.maxX > minX && o.maxY > minY && o.minZ < maxZ) 

हालांकि, मैं अगर यह एक तुलनीय का उपयोग कर संभव है यकीन नहीं है:

मैं मूल रूप से एक compareTo विधि है कि परिणाम पैदावार -1 केवल जब निम्न अगर बयान सही है लागू करना चाहते हैं , या ऐसा लगता है कि मैं बस इतना परिचित नहीं हूं। क्योंकि जब मैं दृष्टिकोण

public int compareTo(IsoSprite o) { 
    if (o.maxX > minX && o.maxY > minY && o.minZ < maxZ){ 
     return -1; 
    }else if(o.maxX < minX && o.maxY < minY && o.minZ > maxZ){ 
     return 1; 
    } 
    return 0; 
} 

मैं त्रुटि प्राप्त की कोशिश "तुलना विधि अपने सामान्य अनुबंध का उल्लंघन करती!"। मैं यह स्पष्ट करना चाहता हूं कि मुझे इस त्रुटि का अर्थ समझने में सहायता की आवश्यकता नहीं है, क्योंकि मैंने इसके बारे में कई प्रश्न पढ़े हैं। हालांकि, मैं अभी भी इस विशेष समस्या के आसपास अपना मन नहीं डाल सकता, क्योंकि मैंने जो अन्य प्रश्नों को पढ़ा है, उनके समाधान छोटे हैं।

मैं वास्तव में इस तुलना के साथ कुछ मदद की सराहना करता हूं, यह एक जीवन बचतकर्ता होगा। किसी भी इनपुट की भी सराहना की है।

संपादित करें: चारों ओर परीक्षण के बाद, मैं कुछ है कि लगभग काम करता है (सभी मामलों में नहीं) मिल गया है, लेकिन मैं समझ नहीं क्यों:

public int compareTo(IsoSprite o) { 
    if (o.maxX > minX && o.maxY > minY && o.minZ < maxZ) { 
     return -1; 
    } else if (o.maxX > minX && o.maxY > minY && o.minZ > maxZ) { 
     return 1; 
    }else if (o.maxX < minX && o.maxY > minY && o.minZ > maxZ) { 
     return 1; 
    }else if (o.maxX < minX && o.maxY < minY && o.minZ > maxZ) { 
     return 1; 
    }else if (o.maxX < minX && o.maxY > minY && o.minZ < maxZ) { 
     return 1; 
    }else if (o.maxX > minX && o.maxY < minY && o.minZ > maxZ) { 
     return 1; 
    }else if (o.maxX < minX && o.maxY < minY && o.minZ > maxZ) { 
     return 1; 
    }else if (o.maxX > minX && o.maxY < minY && o.minZ < maxZ) { 
     return 1; 
    }else if (o.maxX < minX && o.maxY > minY && o.minZ < maxZ) { 
     return 1; 
    }else if(this != o){ 
     return 1; 
    } 
    return 0; 
} 
+1

http://stackoverflow.com/questions/8327514/comparison-method-violates-its- सामान्य- शीर्ष उत्तर का पालन करें उपयोगी हो सकता है – twentylemon

+3

आप जानते हैं कि आपका कोड तुलनात्मक के सामान्य अनुबंध का उल्लंघन करता है (संभवतः पारगमनशीलता नियम में विफल होने से) , तो इसे सॉर्ट करने के लिए उपयोग नहीं किया जा सकता है। अवधि। आपका प्रश्न एक [XY समस्या] (http://mywiki.wooledge.org/XyProblem) हो सकता है, जहां आप एक विशिष्ट कोड समस्या को हल करने के लिए कहें जब सबसे अच्छा समाधान पूरी तरह से अलग दृष्टिकोण का उपयोग करना है। बेहतर है कि आप हमें उस समग्र समस्या को बताएं जिसे आप हल करने का प्रयास कर रहे हैं, इसके बजाय आप इसे हल करने की कोशिश कर रहे हैं। –

+0

@ होवरक्राफ्टफुलऑफेल यह केवल इतना ही विशिष्ट समस्या नहीं है, मैं इससे पहले भी इस तरह की समस्याओं में भाग गया हूं, ऐसा लगता है कि किसी भी तरह से तुलनात्मक रूप से हल किया जा सकता है – Deminth

उत्तर

2

आप इस का उपयोग कर रहे हैं, तो अपने वस्तुओं को सॉर्ट करने, तो आपके तुलनात्मक या तुलनात्मक को अच्छी तरह से व्यवहार किया जाना चाहिए और ट्रांजिटिव और अन्य नियमों का सम्मान करना चाहिए। यदि नहीं, तो आपका कोड टूटा हुआ है। यह अनुशंसा की जाती है कि आपकी तुलनात्मक विधियां बराबर के साथ सुसंगत हों, इसका मतलब है कि a.compareTo (बी) 0 देता है और केवल अगर एक .equals (बी), लेकिन हटाए गए उत्तर में जैसा बताया गया था, यह एक पूर्ण आवश्यकता नहीं है ।

आपका कोड अभी भी की तुलना, अर्थात् कि

a.compareTo(b) == -b.compareTo(a) 

के अपने नियमों पर नजर डालते हैं के लिए नियम की तरह है विनिमेय टूट जाता है:

public int compareTo(IsoSprite o) { 
    // Comparison A 
    if (o.maxX > minX && o.maxY > minY && o.minZ < maxZ) { 
     return -1; 
    // Comparison B 
    } else if (o.maxX > minX && o.maxY > minY && o.minZ > maxZ) { 
     return 1; 
    // Comparison C 
    }else if (o.maxX < minX && o.maxY > minY && o.minZ > maxZ) { 
     return 1; 
    // Comparison D 
    }else if (o.maxX < minX && o.maxY < minY && o.minZ > maxZ) { 
     return 1; 
    // Comparison E 
    }else if (o.maxX < minX && o.maxY > minY && o.minZ < maxZ) { 
     return 1; 
    // Comparison F 
    }else if (o.maxX > minX && o.maxY < minY && o.minZ > maxZ) { 
     return 1; 
    // Comparison G 
    }else if (o.maxX < minX && o.maxY < minY && o.minZ > maxZ) { 
     return 1; 
    // Comparison H 
    }else if (o.maxX > minX && o.maxY < minY && o.minZ < maxZ) { 
     return 1; 
    // Comparison I 
    }else if (o.maxX < minX && o.maxY > minY && o.minZ < maxZ) { 
     return 1; 
    // Comparison J 
    }else if(this != o){ 
     return 1; 
    } 
    return 0; 
} 

"तुलना सी" में देखो:

}else if (o.maxX < minX && o.maxY > minY && o.minZ > maxZ) { 

जो लौटाता है 1. इसका उलटा -1 होना चाहिए, लेकिन ऐसा नहीं है क्योंकि हम "सी" में बातचीत करते हैं omparison एच ":

}else if (o.maxX > minX && o.maxY < minY && o.minZ < maxZ) { 

लेकिन यह भी 1. रिटर्न इस प्रकार यहाँ (और संभवतः कहीं और) a.compareTo (ख) के बराबर नहीं है - b.compareTo की (क)।

+0

आप सही हैं, इसे तुलनीय के रूप में हल नहीं किया जा सकता – Deminth

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