2015-03-21 3 views
10

में ऑपरेटरों को "<" or ">" ऑपरेटरों के साथ दो ऑब्जेक्ट्स की तुलना करें जावा में दो ऑब्जेक्ट्स को "<" या ">" उदा।जावा

MyObject<String> obj1= new MyObject<String>(“blablabla”, 25); 
MyObject<String> obj2= new MyObject<String>(“nannaanana”, 17); 
if (obj1 > obj2) 
    do something. 

मैं

public class MyObject<T extends Comparable<T>> implements Comparable<MyObject<T>> और बनाया विधि कॉम्प लेकिन सभी लाभ मुझे मिल गया के रूप में MyObject वर्ग हैडर कर दिया है मैं "प्रकार" का उपयोग कर सकते वस्तुओं की सूची में अब है, लेकिन मैं कैसे तुलना कर सकते हैं एक दूसरे के लिए दो वस्तुओं सीधे?

if(obj1.compareTo(obj2) > 0) 
    do something 

एकमात्र तरीका है?

+0

" [' तुलना करने के लिए]] एकमात्र तरीका है? " हां। – Kevin

+1

आप जावा में '<' or '>' ऑपरेटरों को अधिभारित नहीं कर सकते हैं। –

+0

सी # में आप इस तरह के ऑपरेटरों को अधिभारित कर सकते हैं। –

उत्तर

11

आप जावा में ऑपरेटर ओवरलोडिंग नहीं कर सकते हैं। इसका अर्थ यह है कि आप ऑपरेटरों के लिए +, >, <, == इत्यादि के लिए कस्टम व्यवहार को परिभाषित करने में सक्षम नहीं हैं।

जैसा कि आपने पहले ही उल्लेख किया है, Comparable लागू करना और compareTo() विधि का उपयोग संभवतः इस मामले में जाने का तरीका है।

एक अन्य विकल्प या बनाने के लिए एक Comparator (docs देखें), विशेष रूप से अगर यह मतलब नहीं है वर्ग Comparable को लागू करने के लिए है कि आप अलग अलग तरीकों से एक ही कक्षा से वस्तुओं की तुलना करने की आवश्यकता है।

कोड पठनीयता में सुधार करने के लिए आप compareTo() का उपयोग कर सकते हैं जो कस्टम विधियों के साथ अधिक प्राकृतिक लग सकते हैं। उदाहरण के लिए:

boolean isGreaterThan(MyObject<T> that) { 
    return this.compareTo(that) > 0; 
} 

boolean isLessThan(MyObject<T> that) { 
    return this.compareTo(that) < 0; 
} 

तो फिर तुम इस तरह उन्हें इस्तेमाल कर सकते हैं:

if (obj1.isGreaterThan(obj2)) { 
    // do something 
} 
3

Comparable.compareTo(T) का उपयोग करना ही एकमात्र विकल्प (या Comparator) है। इंटरफ़ेस केवल उस विधि को परिभाषित करता है (जबकि Comparatorequals जोड़ता है), और यह इस ऑब्जेक्ट को ऑर्डर के लिए निर्दिष्ट ऑब्जेक्ट से तुलना करता है। आगे, जावा ऑपरेटर ओवरलोडिंग की अनुमति नहीं देता है (इसलिए आप उस विधि को आविष्कार करने के लिए उपयोग किए गए ऑपरेंड को सीधे बदलने में सक्षम नहीं होंगे; या वास्तव में इंटरफ़ेस को संशोधित करें)।

+1

'तुलनात्मक' भी है। – Makoto

+0

@ मकोटो ['तुलनाकर्ता '] (http://docs.oracle.com/javase/7/docs/api/java/util/Comparator.html) दो विधियों को प्रदान करता है (और अभी भी ऑपरेटर ओवरलोडिंग की अनुमति नहीं देता है), लेकिन यह एक उचित मुद्दा है कि यह तकनीकी रूप से एक और विकल्प है। –

+0

मैं इसे "अन्य विकल्प" कोण से देख रहा था। :) – Makoto

1

यह एकमात्र तरीका नहीं है। आप एक तुलनात्मक भी लागू कर सकते हैं। का विरोध करने के रूप में तुलनात्मक compare() विधि का उपयोग करता है जो compareTo() विधि का उपयोग करता है।

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

वस्तुओं की तुलना करने के लिए, उन वस्तुओं को तुलनीय होना चाहिए। आपको जावा को परिभाषित करने और बताए जाने की आवश्यकता है कि आप उनकी तुलना कैसे करना चाहते हैं।

जावा संग्रह sort विधि प्रदान करता है। हालांकि कुछ स्कूल आपको अपनी तरह के तरीकों को लिखने के लिए कहने का कार्य सौंपा है जो अंततः तुलना के लिए compareTo() का उपयोग करता है।What is the difference between compare() and compareTo()?


मुझे लगता है कि यह भी है कि उल्लेख के लायक है, डिफ़ॉल्ट रूप से जावा यदि आप एक lexicographical क्रम में तुलना स्ट्रिंग (वस्तुओं):

आप Comparable के बीच सूक्ष्म अंतर बनाम Comparator यहाँ पर एक नज़र ले जा सकते हैं compareTo() विधि को ओवरराइड नहीं किया।