2010-11-05 11 views
112

संभावित डुप्लिकेट:
difference between compare() and compareTo()
Java: What is the difference between implementing Comparable and Comparator?जावा: तुलनीय तुलनाकारी बनाम

क्या तुलनीय और तुलनाकारी के बीच कुंजी मतभेद हैं।

और किस परिदृश्य में दूसरे पर प्राथमिकता दी जाती है?

धन्यवाद

अपडेट किया गया - उदाहरण के साथ अच्छा लिंक !!

http://www.digizol.com/2008/07/java-sorting-comparator-vs-comparable.html

+2

http://grdurand.com/static/presentation_four/comparable.html –

+1

इसके अलावा: [तुलनात्मक और तुलनात्मक का उपयोग करने के लिए] (http://stackoverflow.com/q/2266827/642706)। –

+0

उत्कृष्ट उदाहरण लिंक। सरल और स्पष्ट। पढ़ो – Androidster

उत्तर

158

जब आपकी कक्षा Comparable लागू करती है, तो compareTo कक्षा की विधि उस वस्तु के "प्राकृतिक" क्रम को परिभाषित कर रही है। उस विधि पर अन्य तरीकों के अनुरूप होने के लिए यह विधि संविदात्मक रूप से बाध्य होती है (हालांकि मांग नहीं की जाती है), जैसे कि .equals() तुलना सही होने पर ऑब्जेक्ट्स के लिए 0 को हमेशा वापस किया जाना चाहिए।

Comparator दो वस्तुओं की तुलना करने की अपनी परिभाषा है, और वस्तुओं की तुलना करने के लिए इसका उपयोग किया जा सकता है जो प्राकृतिक क्रम के साथ संरेखित नहीं हो सकता है।

उदाहरण के लिए, स्ट्रिंग्स आमतौर पर वर्णानुक्रम से तुलना की जाती हैं। इस प्रकार "a".compareTo("b") वर्णानुक्रम तुलना का उपयोग करेगा। यदि आप लंबाई पर स्ट्रिंग्स की तुलना करना चाहते हैं, तो आपको एक कस्टम तुलनित्र लिखना होगा।

संक्षेप में, इसमें कोई अंतर नहीं है। वे दोनों समान साधनों के लिए समाप्त होते हैं। सामान्य रूप से प्राकृतिक आदेश के लिए तुलनीय लागू करने के लिए, (प्राकृतिक आदेश परिभाषा स्पष्ट रूप से व्याख्या के लिए खुला है), और अन्य सॉर्टिंग या तुलना आवश्यकताओं के लिए एक तुलनित्र लिखें।

+8

तुलनात्मक रूप से वस्तु के अंदर लागू किया जाना चाहिए। तो तुलना के साथ बनाई गई एक निर्भरता है जो ऑब्जेक्ट की तुलना करने के लिए एक विशेष प्रकार के कार्यान्वयन के लिए लागू की जाएगी। लेकिन, तुलनित्र बाहरी है और हमारे पास एक ही ऑब्जेक्ट के लिए एकाधिक प्रकार के तुलनित्र हो सकते हैं। मेरी समझ के लिए सुधार की भी आवश्यकता है। – Sridhar

+0

एक मामला मुझे सामना करना पड़ा है, यह है कि आप किसी भी फ़ील्ड को यादृच्छिक रूप से यादृच्छिक रूप से सॉर्ट करना चाहते हैं, इस स्थिति में आप वर्ग के संग्रह को क्रमबद्ध करने के लिए तुलनात्मक रूप से तुलनात्मक रूप से पारित कर सकते हैं, लेकिन यदि आप बस किसी अन्य पर विशिष्टता को परिभाषित करना चाहते हैं अपनी कक्षा में संपत्ति, फिर वर्ग के अंदर तुलनात्मक लागू करें। वे पारस्परिक रूप से विशिष्ट नहीं हैं। – markg

106

Comparator क्या आप कोई नियंत्रण नहीं है कि प्रकार के लिए कस्टम तुलना तर्क प्रदान करने के लिए एक तरह से प्रदान करता है।

Comparable आपको यह निर्दिष्ट करने की अनुमति देता है कि आप किस ऑब्जेक्ट को कार्यान्वित कर रहे हैं तुलना की जाती है।

जाहिर है, यदि आपके पास कक्षा पर नियंत्रण नहीं है (या आप उन वस्तुओं की तुलना करने के लिए कई तरीके प्रदान करना चाहते हैं जिन पर आपके नियंत्रण हैं) तो Comparator का उपयोग करें।

अन्यथा आप Comparable का उपयोग कर सकते हैं।

+30

** स्रोत पर नियंत्रण ** यहां कीवर्ड है। –

+0

@ जोनासग्रॉगर क्या आप कक्षा में नियंत्रण नहीं रखते हैं? – TheLogicGuy

+0

@TheLogicGuy आपके पास किसी वर्ग पर नियंत्रण नहीं है यदि यह निर्भरता या अन्य कोड से है जिसे आप बदलने की अनुमति नहीं दे सकते हैं। –

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