एक कक्षा को तुलनीय और / या तुलनाकर्ता कब होना चाहिए?


138

मैंने ऐसी कक्षाएं देखी हैं जो तुलनात्मक और तुलनात्मक दोनों को लागू करती हैं । इसका क्या मतलब है? मैं क्यों एक दूसरे पर प्रयोग करेंगे?


18
क्या आपने उन पर जावदोक पढ़ा है? यह बिल्कुल स्पष्ट रूप से भिन्न का वर्णन करता है।
स्केफमैन

1
तुलनीय और तुलनित्र क्या है और तुलनीय और तुलनित्र का उपयोग कब करना है। ये जानने के लिए इस लिंक को पढ़ें। इससे आपको उनके व्यवहार और उपयोग को समझने में मदद मिलेगी। http://iandjava.blogspot.in/2012/10/comparable-and-comparator.html
RockStar

6
यह एक अच्छा, अच्छा वस्तुनिष्ठ उत्तर वाला प्रश्न है। मैं निराश हूं कि यह बंद है।
रसेल सिल्वा

3
StackOverflow पर अन्य प्रश्न इसे "तुलनीय और तुलनीय के बीच अंतर क्या है" प्रश्न के रूप में संदर्भित करते हैं। इसे "रचनात्मक नहीं" के रूप में चिह्नित क्यों किया गया है? एक जावा नौसिखिया के रूप में, यह एक बहुत ही उपयोगी प्रश्न था!
पीट

जवाबों:


241

नीचे दिया गया पाठ तुलनित्र बनाम तुलनीय से आता है

तुलनीय

एक तुलनीय वस्तु दूसरी वस्तु के साथ तुलना करने में सक्षम है। वर्ग java.lang.Comparableको अपने उदाहरणों की तुलना करने में सक्षम होने के लिए इंटरफ़ेस को लागू करना चाहिए ।

तुलनित्र

एक तुलनित्र वस्तु दो अलग-अलग वस्तुओं की तुलना करने में सक्षम है। वर्ग अपने उदाहरणों की तुलना नहीं कर रहा है, लेकिन कुछ अन्य वर्ग के उदाहरण हैं। इस तुलनित्र वर्ग को java.util.Comparatorइंटरफ़ेस को लागू करना होगा ।


तुलनित्र और तुलनीय दोनों के उपयोग की विस्तृत व्याख्या के लिए: sysdotoutdotprint.com/index.php/2017/03/28/…
mel3kings

2
एक और अच्छा लेख: codecramp.com/java-comparable-vs-comparator
EMM

@ मेल 3kings - लिंक अधिक सुलभ नहीं है।
गौरव

152

लागू करने का Comparableअर्थ है " मैं खुद को किसी अन्य वस्तु के साथ तुलना कर सकता हूं। " यह आमतौर पर तब उपयोगी होता है जब एक एकल प्राकृतिक डिफ़ॉल्ट तुलना होती है।

लागू करने का Comparatorअर्थ है " मैं दो अन्य वस्तुओं की तुलना कर सकता हूं। " यह आमतौर पर तब उपयोगी होता है जब एक प्रकार के दो उदाहरणों की तुलना करने के कई तरीके होते हैं - जैसे कि आप लोगों की उम्र, नाम आदि से तुलना कर सकते हैं।


1
हेलो स्कीट, क्या आप तुलनीय और तुलनित्र का उपयोग कर कोड को गिरा सकते हैं।
Mdhar9e

5
@ mdhar9e: इसके आसपास बहुत सारे उदाहरण हैं - यदि आपको उन्हें अपने विशिष्ट परिदृश्य में अनुवादित करना मुश्किल लग रहा है, तो कृपया एक नए प्रश्न में अधिक जानकारी दें।
जॉन स्कीट

2
@alireza: मैंने पहले ही दूसरे पैराग्राफ में एक उदाहरण दिया है: अलग-अलग तुलना करने वाले, आप एक ही संग्रह (लोगों) को अलग-अलग गुणों (आयु, नाम आदि) द्वारा क्रमबद्ध कर सकते हैं। आप इसे Personलागू करने से Comparableनहीं कर सकते, क्योंकि आप तब दो लोगों की तुलना कैसे बदल सकते हैं।
जॉन स्कीट

1
@feelgoodandprogramming: नहीं, वे अलग-अलग सॉर्टिंग एल्गोरिदम हैं । तीन अलग-अलग वर्गों में संभावित रूप से कोड के तीन टुकड़े हैं: 1) इकाई स्वयं, उदा Person। 2) तुलनित्र, उदाहरण के लिए, PersonAgeComparatorजो दो अलग-अलग संस्थाओं की तुलना करने में सक्षम है और यह तय करता है कि उस विशेष क्रम में पहले आना चाहिए। 3) सॉर्ट कोड, जो संस्थाओं और एक तुलनित्र का एक संग्रह लेता है, और आदेश को निर्धारित करने के लिए तुलनित्र का उपयोग करके उस संग्रह को क्रमबद्ध करता है।
जॉन स्कीट

2
@ ऋषिकेशपाठक: वैसे यह अधिक है कि आप तुलना का उपयोग करते हैं यदि तुलना करने के लिए केवल एक ही स्पष्ट बात है। और तब भी आप सिर्फ एक कॉम्पैक्टर लिख सकते हैं । यदि आपके पास एक ही कक्षा का उपयोग करने के दो अलग-अलग कार्यक्रम हैं, और एक को सिर्फ उम्र के आधार पर और दूसरे को केवल नाम से क्रमबद्ध करना चाहते हैं, तो उनमें से कम से कम एक को तुलनित्र का उपयोग करने की आवश्यकता होगी।
जॉन स्कीट

38

तुलनीय एक वर्ग को अपनी तुलना लागू करने देता है:

  • यह एक ही कक्षा में है (यह अक्सर एक फायदा होता है)
  • केवल एक ही कार्यान्वयन हो सकता है (इसलिए यदि आप दो अलग-अलग मामलों को चाहते हैं तो आप उसका उपयोग नहीं कर सकते)

तुलना करके, तुलनित्र एक बाहरी तुलना है:

  • यह आम तौर पर एक अद्वितीय उदाहरण में होता है (या तो एक ही कक्षा में या दूसरी जगह पर)
  • आप प्रत्येक कार्यान्वयन को उस तरह से नाम देते हैं जिस तरह से आप चीजों को क्रमबद्ध करना चाहते हैं
  • आप उन वर्गों के लिए तुलनित्र प्रदान कर सकते हैं जिन्हें आप नियंत्रित नहीं करते हैं
  • पहली वस्तु अशक्त होने पर भी कार्यान्वयन उपयोगी है

दोनों कार्यान्वयन में, आप अभी भी चुन सकते हैं कि आप क्या तुलना करना चाहते हैं । जेनरिक के साथ, आप ऐसा घोषित कर सकते हैं, और इसे संकलन-समय पर जांचा है। इससे सुरक्षा में सुधार होता है, लेकिन उचित मूल्य निर्धारित करना भी एक चुनौती है।

एक दिशानिर्देश के रूप में, मैं आम तौर पर सबसे सामान्य वर्ग या इंटरफ़ेस का उपयोग करता हूं, जिसके लिए उस वस्तु की तुलना की जा सकती है, सभी उपयोग के मामलों में मैं कल्पना करता हूं ... हालांकि एक परिभाषा बहुत सटीक नहीं है! :-(

  • Comparable<Object>आप इसे संकलन-समय पर सभी कोडों में उपयोग करने देते हैं (जो जरूरत पड़ने पर अच्छा है, या बुरा है और यदि आप संकलन-समय त्रुटि को ढीला करते हैं); आपके कार्यान्वयन को वस्तुओं के साथ सामना करना पड़ता है, और आवश्यकतानुसार डाली जाती है लेकिन एक मजबूत तरीके से।
  • Comparable<Itself> इसके विपरीत बहुत सख्त है।

मजेदार, जब आप अपने आप को उपवर्ग में ले जाते हैं, तो उपवर्ग भी तुलनात्मक होना चाहिए और इसके बारे में मजबूत होना चाहिए (या यह लिस्कोव सिद्धांत को तोड़ देगा, और आपको रनटाइम त्रुटियां देगा)।


20

java.lang.Comparable

  1. Comparableइंटरफ़ेस को लागू करने के लिए , क्लास को एक ही तरीका लागू करना होगाcompareTo()

    int a.compareTo(b)

  2. आपको उस वर्ग को संशोधित करना होगा जिसका उदाहरण आप सॉर्ट करना चाहते हैं। ताकि प्रति कक्षा में केवल एक ही क्रम बनाया जा सके।

java.util.Comparator

  1. तुलनित्र इंटरफ़ेस को लागू करने के लिए, कक्षा को एक ही विधि को लागू करना चाहिए compare()

    int compare (a,b)

  2. आप उस वर्ग से अलग वर्ग बनाते हैं जिसका उदाहरण आप छाँटना चाहते हैं। ताकि प्रति कक्षा में कई प्रकार के अनुक्रम बनाए जा सकें।

14

Comparable डेटा ऑब्जेक्ट पर डिफ़ॉल्ट ऑर्डर देने के लिए है, उदाहरण के लिए यदि डेटा ऑब्जेक्ट में प्राकृतिक ऑर्डर है।

A Comparatorविशिष्ट उपयोग के लिए आदेश देने का प्रतिनिधित्व करता है।


8

Comparableआमतौर पर पसंद किया जाता है। लेकिन कभी-कभी एक वर्ग पहले से ही लागू होता है Comparable, लेकिन आप एक अलग संपत्ति पर सॉर्ट करना चाहते हैं। तब आप एक का उपयोग करने के लिए मजबूर कर रहे हैं Comparator

कुछ कक्षाएं वास्तव में Comparatorsसामान्य मामलों के लिए प्रदान करती हैं ; उदाहरण के लिए, Stringजब सॉर्ट किया जाता है तो डिफ़ॉल्ट रूप से संवेदनशील होते हैं, लेकिन एक स्थैतिक भी Comparatorकहा जाता है CASE_INSENSITIVE_ORDER


7
मुझे यकीन नहीं है कि मैं तुलनीय पसंद किए जाने से सहमत हूं। कुछ वस्तुओं में प्राकृतिक क्रम की एक मजबूत भावना होती है - अर्थात् संख्याएँ, उनके सभी रूपों में: प्राकृतिक संख्याएँ, वास्तविक संख्याएँ, दिनांक इत्यादि। लेकिन यहाँ तक कि अन्य अपेक्षाकृत आदिम वस्तुओं जैसे कि वर्ण तार में सार्वभौमिक रूप से लागू क्रम का अभाव होता है। अनुप्रयोग डोमेन मॉडल से एक इकाई की तरह अधिक जटिल वस्तुओं के मामले में, तुलनीय को लागू करना आमतौर पर एक गलती है। उनकी कई संपत्तियां यह अनुमान लगाना बहुत मुश्किल है कि सबसे अधिक बार किस क्रम की आवश्यकता होगी।
इरिकसन

6

मैं वेब पर पाए जाने वाले कम्पैरिलेटर और कम्पैरिबल के बीच कुछ अंतर हैं:

  1. यदि आप देखते हैं कि इन दोनों के बीच तार्किक अंतर जावा में कम्पैरिज़र है, तो उसे प्रदान की गई दो वस्तुओं की तुलना करें, जबकि तुलनात्मक इंटरफ़ेस निर्दिष्ट ऑब्जेक्ट के साथ "इस" संदर्भ की तुलना करता है।

  2. जावा में तुलनीय का उपयोग वस्तु के प्राकृतिक क्रम को लागू करने के लिए किया जाता है। जावा एपीआई स्ट्रिंग में, दिनांक और आवरण कक्षाएं तुलनात्मक इंटरफ़ेस को लागू करते हैं।

  3. यदि कोई वर्ग जावा में तुलनीय इंटरफ़ेस लागू करता है, तो उस ऑब्जेक्ट का संग्रह या तो सूची या सरणी को संग्रह (एसओआरटी) (या एरेई.ॉर्ट) () विधि का उपयोग करके स्वचालित रूप से सॉर्ट किया जा सकता है और तुलनात्मक विधि द्वारा परिभाषित प्राकृतिक आदेश के आधार पर ऑब्जेक्ट को सॉर्ट किया जाएगा।

  4. जावा में तुलनीय को लागू करने वाली वस्तुओं को किसी भी तुलनित्र को निर्दिष्ट किए बिना, उदाहरण के लिए ट्रीसैट में सॉर्ट किए गए नक्शे या तत्वों में कुंजी के रूप में उपयोग किया जा सकता है।

साइट: जावा में कम्पैरिलेटर और कम्पैरिबल का उपयोग कैसे करें? उदाहरण के साथ

और पढ़ें: जावा में कंपैरिलेटर और कम्पैरिबल का उपयोग कैसे करें? उदाहरण के साथ


5

Comparableएक प्राकृतिक आदेश के साथ वस्तुओं के लिए है। वस्तु स्वयं जानती है कि उसे कैसे आदेश दिया जाना है।
Comparatorएक प्राकृतिक आदेश के बिना वस्तुओं के लिए या जब आप एक अलग आदेश का उपयोग करना चाहते हैं।


4

तुलनित्र और तुलनीय इंटरफेस के बीच अंतर

Comparable किसी अन्य ऑब्जेक्ट के साथ उपयोग करके खुद की तुलना करने के लिए उपयोग किया जाता है।

Comparator दो डेटाटाइप्स ऑब्जेक्ट्स की तुलना करने के लिए उपयोग किया जाता है।


2

यदि आप देखते हैं कि इन दोनों के बीच तार्किक अंतर Comparatorजावा में है, तो उसे प्रदान की गई दो वस्तुओं की तुलना करें, जबकि Comparableइंटरफ़ेस निर्दिष्ट ऑब्जेक्ट के साथ "इस" संदर्भ की तुलना करता है।

Comparableजावा में वस्तु के प्राकृतिक क्रम को लागू करने के लिए उपयोग किया जाता है। जावा एपीआई स्ट्रिंग में, तिथि और आवरण कक्षाएं Comparableइंटरफ़ेस को लागू करती हैं।

यदि कोई भी वर्ग Comparableजावा में इंटरफ़ेस लागू करता है तो उस वस्तु का संग्रह Listया तो Arrayस्वचालित रूप से Collections.sort()या Array.sort()विधि या उपयोग करके सॉर्ट किया जा सकता है और compareToविधि द्वारा परिभाषित प्राकृतिक क्रम के आधार पर ऑब्जेक्ट को सॉर्ट किया जाएगा ।

Comparableजावा में कार्यान्वित होने वाली वस्तुओं को एक सॉर्ट किए गए नक्शे या तत्वों में कुंजी के रूप में उपयोग किया जा सकता है TreeSet, उदाहरण के लिए किसी भी निर्दिष्ट किए बिना Comparator


0

तुलनीय और तुलनित्र को लागू करने के लिए मेरा एनोटेशन परिवाद:

public class Person implements Comparable<Person> {         
    private String firstName;  
    private String lastName;         
    private int age;         
    private char gentle;         

    @Override         
    @CompaProperties({ @CompaProperty(property = "lastName"),              
        @CompaProperty(property = "age",  order = Order.DSC) })           
    public int compareTo(Person person) {                 
        return Compamatic.doComparasion(this, person);         
    }  
} 

अधिक उदाहरण देखने के लिए लिंक पर क्लिक करें। compamatic


3
Stackoverflow में आपका स्वागत है। यह प्रश्न पुराना है और पहले से ही उत्तर दिया गया था। आमतौर पर, बासी धागे को फिर से जीवित नहीं करना सबसे अच्छा है जब तक कि आपकी प्रतिक्रिया पिछले जवाबों में कुछ नया या अलग नहीं करती है।
oers
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.