जावा compare()और compareTo()विधियों के बीच अंतर क्या है ? क्या वे तरीके समान जवाब देते हैं?
जावा compare()और compareTo()विधियों के बीच अंतर क्या है ? क्या वे तरीके समान जवाब देते हैं?
जवाबों:
से JavaNotes :
a.compareTo(b):
तुलनात्मक इंटरफ़ेस: मूल्यों की तुलना करता है और एक इंट को लौटाता है जो बताता है कि क्या मान तुलना से कम, बराबर या अधिक से अधिक है।
यदि आपकी कक्षा की वस्तुओं में एक प्राकृतिक ऑर्डर है , तो Comparable<T>इंटरफ़ेस को लागू करें और इस पद्धति को परिभाषित करें। सभी जावा वर्गों एक प्राकृतिक आदेश लागू करते है Comparable<T>- उदाहरण: String, आवरण वर्गों ,BigInteger
compare(a, b):
तुलनित्र इंटरफ़ेस: दो वस्तुओं के मूल्यों की तुलना करता है। इस के हिस्से के रूप कार्यान्वित किया जाता है Comparator<T>इंटरफ़ेस, और विशिष्ट प्रयोग जैसे तरीकों को पारित करने के लिए एक या अधिक छोटे उपयोगिता वर्गों है कि यह लागू, परिभाषित करने के लिए है sort()या इस तरह के डेटा संरचना छँटाई द्वारा उपयोग के लिए TreeMapऔरTreeSet । आप निम्नलिखित के लिए एक तुलनित्र वस्तु बनाना चाहते हैं:
sort()विधि में पास होने के लिए इनमें से प्रत्येक के लिए एक तुलनित्र को परिभाषित करेंगे ।यदि आपकी कक्षा की वस्तुओं में एक प्राकृतिक क्रमबद्ध क्रम है, तो आपको तुलना () की आवश्यकता नहीं हो सकती है।
Http://www.digizol.com/2008/07/java-sorting-comparator-vs-comparable.html से सारांश
तुलनीय
एक तुलनीय वस्तु दूसरे वस्तु के साथ तुलना करने में सक्षम है।
तुलनित्र
एक तुलनित्र वस्तु दो अलग-अलग वस्तुओं की तुलना करने में सक्षम है। वर्ग अपने उदाहरणों की तुलना नहीं कर रहा है, लेकिन कुछ अन्य वर्ग के उदाहरण हैं।
केस संदर्भों का उपयोग करें:
तुलनात्मक इंटरफ़ेस
बराबरी विधि और ==और != ऑपरेटर समानता / असमानता के लिए परीक्षण करते हैं , लेकिन सापेक्ष मूल्यों के लिए परीक्षण करने का एक तरीका प्रदान नहीं करते हैं ।
कुछ कक्षाएं (जैसे, एक प्राकृतिक आदेश के साथ स्ट्रिंग और अन्य कक्षाएं) Comparable<T>इंटरफ़ेस को लागू करती हैं , जो एक compareTo()विधि को परिभाषित करती है ।
आप Comparable<T>अपनी कक्षा में लागू करना चाहते हैं यदि आप इसे Collections.sort()या Arrays.sort()विधियों के साथ उपयोग करना चाहते हैं ।
एक तुलनित्र वस्तु को परिभाषित करना
आप किसी भी वर्ग के लिए किसी भी तरह के मनमाने तरीके से तुलना करने के लिए कम्पैरिटर बना सकते हैं ।
उदाहरण के लिए, Stringवर्ग CASE_INSENSITIVE_ORDERतुलनित्र को परिभाषित करता है ।
दो दृष्टिकोणों के बीच के अंतर को इस धारणा से जोड़ा जा सकता है:
आदेशित संग्रह :
जब एक संग्रह का आदेश दिया जाता है, तो इसका मतलब है कि आप एक विशिष्ट (नहीं-यादृच्छिक) क्रम में संग्रह में पुनरावृति कर सकते हैं (एक Hashtableआदेश नहीं है)।
एक प्राकृतिक आदेश के साथ एक संग्रह केवल आदेश नहीं दिया गया है, लेकिन क्रमबद्ध है । प्राकृतिक व्यवस्था को परिभाषित करना मुश्किल हो सकता है! ( प्राकृतिक स्ट्रिंग क्रम में )।
एक और अंतर, टिप्पणियों में हैगुआस द्वारा इंगित किया गया :
Comparable कार्यान्वयन में है और इंटरफ़ेस से दिखाई नहीं देता है, इसलिए जब आप सॉर्ट करते हैं तो आपको वास्तव में पता नहीं होता है कि क्या होने जा रहा है। Comparator आपको आश्वस्त करता है कि आदेश को अच्छी तरह से परिभाषित किया जाएगा। compareTo()से है Comparableइंटरफ़ेस।
compare()से है Comparatorइंटरफ़ेस।
दोनों विधियां समान कार्य करती हैं, लेकिन प्रत्येक इंटरफ़ेस का उपयोग कुछ अलग संदर्भ में किया जाता है।
तुलनीय इंटरफेस को लागू करने वर्ग की वस्तुओं पर एक प्राकृतिक आदेश लागू करने के लिए प्रयोग किया जाता है। compareTo()विधि प्राकृतिक तुलना विधि कहा जाता है। तुलनाकारी इंटरफेस को लागू करने वर्ग की वस्तुओं पर कुल आदेश लागू करने के लिए प्रयोग किया जाता है। अधिक जानकारी के लिए, प्रत्येक इंटरफ़ेस का उपयोग करने के लिए लिंक को बिल्कुल देखें।
समानताएं:
दोनों दो वस्तुओं की तुलना करने के लिए कस्टम तरीके हैं।
दोनों intदो वस्तुओं के बीच संबंध का वर्णन करते हुए लौटते हैं।
अंतर:
विधि compare()एक ऐसी विधि है जिसे आप Comparatorइंटरफ़ेस लागू करने पर लागू करने के लिए बाध्य हैं । यह आपको दो वस्तुओं को विधि में पारित करने की अनुमति देता है और यह intउनके संबंधों का वर्णन करता है।
Comparator comp = new MyComparator();
int result = comp.compare(object1, object2);
विधि compareTo()एक ऐसी विधि है जिसे आप Comparableइंटरफ़ेस लागू करने पर लागू करने के लिए बाध्य हैं । यह किसी वस्तु को समान प्रकार की वस्तुओं की तुलना में अनुमति देता है।
String s = "hi";
int result = s.compareTo("bye");
सारांश:
मूल रूप से वे चीजों की तुलना करने के दो अलग-अलग तरीके हैं।
विधियों को समान उत्तर देने की आवश्यकता नहीं है। यह निर्भर करता है कि आप किन वस्तुओं / वर्गों को कहते हैं।
यदि आप अपनी स्वयं की कक्षाएं लागू कर रहे हैं, जिन्हें आप जानते हैं कि आप किसी चरण में तुलना करना चाहते हैं, तो हो सकता है कि आप उन्हें तुलनात्मक इंटरफ़ेस लागू करें और उनके अनुसार तुलना () विधि को लागू करें।
यदि आप एक एपीआई से कुछ वर्गों का उपयोग कर रहे हैं जो तुलनात्मक इंटरफ़ेस को लागू नहीं करते हैं, लेकिन आप अभी भी उनकी तुलना करना चाहते हैं। छँटाई के लिए Ie। आप अपना स्वयं का वर्ग बना सकते हैं जो तुलनित्र इंटरफ़ेस को लागू करता है और इसकी तुलना () विधि में आप तर्क को लागू करते हैं।
तुलनीय इंटरफ़ेस में एक विधि होती है जिसे compareTo(obj)केवल एक तर्क कहा जाता है और यह स्वयं की तुलना दूसरे वर्ग के उदाहरण या वस्तुओं से करता है।
तुलनित्र इंटरफ़ेस में एक विधि होती है जिसे compare(obj1,obj2)दो तर्क लगते हैं और यह एक ही या विभिन्न वर्गों से दो वस्तुओं के मूल्य की तुलना करता है।
compareTo(T object)
java.lang.Comparable इंटरफ़ेस से आता है, इस वस्तु की तुलना करने के लिए कार्यान्वित किया गया है ताकि इस वस्तु के लिए एक नकारात्मक अंतर मान दिया जा सके, 0 से कम हो, समान के लिए, या दूसरे से अधिक के लिए सकारात्मक मूल्य। यह अधिक सुविधाजनक तुलना विधि है, लेकिन जिस कक्षा की आप तुलना करना चाहते हैं उसे लागू करना चाहिए।
compare(T obj1, T obj2)
java.util.Comparator इंटरफ़ेस से आता है, एक अलग वर्ग में कार्यान्वित किया जाता है जो दूसरे वर्ग की वस्तुओं की तुलना पहली वस्तु के लिए एक नकारात्मक अंतर मान देने के लिए करता है, बराबर के लिए 0, या दूसरी वस्तु से अधिक के लिए सकारात्मक मान। जब आप एक वर्ग को लागू नहीं कर सकते हैं तब इसकी आवश्यकता होती है। तुलना () क्योंकि यह परिवर्तनीय नहीं है। इसका उपयोग तब किया जाता है जब आप वस्तुओं की तुलना करने के लिए अलग-अलग तरीके चाहते हैं, न कि केवल एक (जैसे नाम या उम्र के अनुसार)।
तुलनित्र का उपयोग करना, हमारे पास एक वर्ग के लिए लिखित तुलनात्मक तर्क की संख्या हो सकती है ।
उदाहरण के लिए
कार क्लास के लिए
कार मॉडल नंबर के आधार पर तुलना करने के लिए हमारे पास एक तुलनित्र वर्ग हो सकता है। कार मॉडल वर्ष के आधार पर तुलना करने के लिए हमारे पास एक तुलनित्र वर्ग भी हो सकता है।
कार क्लास
public class Car {
int modelNo;
int modelYear;
public int getModelNo() {
return modelNo;
}
public void setModelNo(int modelNo) {
this.modelNo = modelNo;
}
public int getModelYear() {
return modelYear;
}
public void setModelYear(int modelYear) {
this.modelYear = modelYear;
}
}
तुलनित्र # 1 मॉडल नंबर पर आधारित है
public class CarModelNoCompartor implements Comparator<Car>{
public int compare(Car o1, Car o2) {
return o1.getModelNo() - o2.getModelNo();
}
}
तुलनित्र # 2 मॉडल वर्ष पर आधारित है
public class CarModelYearComparator implements Comparator<Car> {
public int compare(Car o1, Car o2) {
return o1.getModelYear() - o2.getModelYear();
}
}
लेकिन यह तुलनात्मक इंटरफ़ेस के मामले में संभव नहीं है ।
तुलनात्मक इंटरफ़ेस के मामले में, हम केवल एक तर्क की तुलना कर सकते हैं ।
इस विधि और इसके सहयोगियों वाली वस्तु का संबंध अलग है।
compareTo()इंटरफ़ेस का एक तरीका है तुलनीय है, इसलिए यह एक और एक करने के लिए इस उदाहरण तुलना करने के लिए प्रयोग किया जाता है।
compare()इंटरफ़ेस तुलनित्र की एक विधि है , इसलिए इसका उपयोग दूसरे वर्ग के दो अलग-अलग उदाहरणों की एक दूसरे के साथ तुलना करने के लिए किया जाता है।
यदि आप करेंगे, तो लागू करने का Comparableअर्थ है कि वर्ग के उदाहरणों की तुलना आसानी से की जा सकती है।
कार्यान्वयन का Comparatorअर्थ है, वह उदाहरण विभिन्न वस्तुओं (अन्य वर्गों के) की तुलना करने के लिए अनुकूल है।
मुख्य अंतर इंटरफेस के उपयोग में है:
तुलनीय (जिसमें तुलनात्मकता है) उस इंटरफ़ेस को कार्यान्वित करने के लिए वस्तुओं की तुलना (ट्रीपार्ट का उपयोग करने के लिए, या सूची को क्रमबद्ध करने के लिए) करने की आवश्यकता होती है। लेकिन क्या होगा यदि वर्ग तुलनीय को लागू नहीं करता है और आप इसे बदल नहीं सकते क्योंकि यह एक 3 पार्टी लाइब्रेरी का हिस्सा है? फिर आपको एक तुलनित्र को लागू करना होगा, जो उपयोग करने के लिए थोड़ा कम सुविधाजनक है।
compareTo()इसे किसी अन्य वस्तु से तुलना करने के लिए एक वस्तु पर बुलाया जाता है।
compare()किसी वस्तु पर दो अन्य वस्तुओं की तुलना करने के लिए कहा जाता है।
अंतर वह है जहां वास्तविक तुलना करने वाले तर्क को परिभाषित किया गया है।
जब आप एक सूची को सॉर्ट करना चाहते हैं जिसमें ऑब्जेक्ट फू शामिल है, फू वर्ग को तुलनात्मक इंटरफ़ेस को लागू करना है, क्योंकि सूची के प्रकार मेथोड इस मेथोड का उपयोग कर रहा है।
जब आप एक यूटिल क्लास लिखना चाहते हैं जो दो अन्य वर्गों की तुलना करता है तो आप कंपैरिटर क्लास को लागू कर सकते हैं।
कर्मचारी तालिका का
नाम,
DoB , वेतन टॉमस, 2/10/1982, 300
डैनियल, 3/11/1990, 400
Kwame, 2/10/1998, 520
तुलनीय उदाहरण के लिए, आप या नाम से तरह सकता है के साथ वेतन से - इंटरफ़ेस आपको एक प्राथमिक क्षेत्र के संदर्भ में वस्तुओं जैसे कर्मचारियों की एक सूची सॉर्ट करने के लिए अनुमति देता है compareTo () विधि
emp1.getName().compareTo(emp2.getName())
ऐसी आवश्यकताओं के लिए अधिक लचीला इंटरफ़ेस तुलनित्र इंटरफ़ेस द्वारा प्रदान किया गया है, जिसकी एकमात्र विधि तुलना () है
public interface Comparator<Employee> {
int compare(Employee obj1, Employee obj2);
}
नमूना कोड
public class NameComparator implements Comparator<Employee> {
public int compare(Employee e1, Employee e2) {
// some conditions here
return e1.getName().compareTo(e2.getName()); // returns 1 since (T)omas > (D)an
return e1.getSalary().compareTo(e2.getSalary()); // returns -1 since 400 > 300
}
}
एक और बात:
compareTo()से है Comparableइंटरफेस और compare()से है Comparatorइंटरफ़ेस।Comparableएक वर्ग के भीतर वस्तुओं के लिए एक डिफ़ॉल्ट आदेश Comparatorको परिभाषित करने के लिए उपयोग किया जाता है, जबकि एक विधि को पारित करने के लिए एक कस्टम आदेश को परिभाषित करने के लिए उपयोग किया जाता है।एक तकनीकी पहलू है जिस पर जोर दिया जाना चाहिए। मान लें कि आपको क्लाइंट वर्ग से तुलना व्यवहार पैरामीटर की आवश्यकता है, और आप सोच रहे हैं कि इस तरह का उपयोग करें Comparableया Comparatorइस विधि के लिए:
class Pokemon {
int healthPoints;
int attackDamage;
public void battle (Comparable<Pokemon> comparable, Pokemon opponent) {
if (comparable.compareTo(opponent) > 0) { //comparable needs to, but cannot, access this.healthPoints for example
System.out.println("battle won");
} else {
System.out.println("battle lost");
}
}
}
comparableलैम्ब्डा या ऑब्जेक्ट होगा, और पोकेमोन comparableके खेतों तक पहुंचने का कोई रास्ता नहीं है this। (एक लैम्ब्डा thisमें, लैम्बडा के दायरे में बाहरी वर्ग के उदाहरण को संदर्भित करता है, जैसा कि प्रोग्राम पाठ में परिभाषित किया गया है।) इसलिए यह उड़ान नहीं भरता है , और हमें Comparatorदो तर्कों के साथ उपयोग करना होगा ।
Important Answar
String name;
int roll;
public int compare(Object obj1,Object obj2) { // For Comparator interface
return obj1.compareTo(obj1);
}
public int compareTo(Object obj1) { // For Comparable Interface
return obj1.compareTo(obj);
}
यहाँ return obj1.compareTo(obj1)या return obj1.compareTo(obj)कथन में केवल ऑब्जेक्ट लेते हैं; आदिम की अनुमति नहीं है। उदाहरण के लिए
name.compareTo(obj1.getName()) // Correct Statement.
परंतु
roll.compareTo(obj1.getRoll())
// Wrong Statement Compile Time Error Because roll
// is not an Object Type, it is primitive type.
नाम स्ट्रिंग ऑब्जेक्ट है तो यह काम किया। यदि आप नीचे दिए गए कोड की तुलना में छात्र के रोल नंबर को क्रमबद्ध करना चाहते हैं।
public int compareTo(Object obj1) { // For Comparable Interface
Student s = (Student) obj1;
return rollno - s.getRollno();
}
या
public int compare(Object obj1,Object obj2) { // For Comparator interface
Student s1 = (Student) obj1;
Student s2 = (Student) obj2;
return s1.getRollno() - s2.getRollno();
}