2010-07-02 8 views
5

मेरे पास एक समस्या है और यह सोच रहा था कि इसे कैसे हल किया जाए। मैं एक सामान्य वर्ग Tuple<A,B> है और अब मैं ए और बी के अनुसार यह इस तरह दिखना चाहिए उनके tuples सॉर्ट करने के लिए करना चाहते हैं:सुनिश्चित करें कि ऑब्जेक्ट्स लागू करने योग्य

क्रमित किए बिना:

 
(1,5) 
(2,8) 
(6,8) 
(1,4) 
(2,4) 

छाँटे गए:

 
(1,4) 
(1,5) 
(2,4) 
(2,8) 
(6,8) 

के लिए उस कारण मैंने ट्यूपल क्लास में एक सामान्य तुलना विधि (public int compareTo(Tuple<A, B> other)) को लागू करने के बारे में सोचा था। एकमात्र समस्या ये है कि सभी ऑब्जेक्ट्स जिन्हें आप वर्ग को पैरामीटर कर सकते हैं (उदा। ए = इंटीजर, बी = स्ट्रिंग) को इस पूरी चीज को काम करने के लिए तुलना करने के लिए भी विधि को कार्यान्वित करना होगा।

क्या यह सुनिश्चित करने का कोई तरीका है कि टुपल सभी ऑब्जेक्ट्स को तुलनात्मक इंटरफ़ेस को कार्यान्वित कर सकता है?

या इस समस्या को हल करने के तरीके पर कोई अन्य सुझाव हैं?

धन्यवाद

उत्तर

5

आप पुनरावर्ती प्रकार सीमा इस्तेमाल कर सकते हैं (यह भी मद Effective Java 27 देखें) कि टपल के घटकों तुलनीय का विस्तार है, तो जैसे निर्दिष्ट करने के लिए:

public class Tuple<A extends Comparable<? super A>, B extends Comparable<? super A>> implements Comparable<Tuple<A, B>> { 
    A valueA; 
    B valueB; 

    @Override 
    public int compareTo(Tuple<A, B> tuple) { 
     // Implement comparison logic 
     return 0; 
    } 
} 

यह आपको के घटकों के लिए विभिन्न प्रकार निर्दिष्ट कर सकते हैं टुपल (ट्यूपल < इंटीजर, स्ट्रिंग >)।

+0

मैं पसंद करता हूं 'ए तुलनात्मक ' बढ़ाता है, लेकिन टुपल पर तुलनात्मक रूप से लागू करने के लिए +1। मुझे याद रखना चाहिए था। –

+0

आह, धन्यवाद। मैंने अपना जवाब संपादित कर दिया है ताकि गुमराह न किया जा सके, और एमएमएर्स के संस्करण को ऊपर उठाया हो। – Lyle

1

यह चाल चलाना चाहिए। आपके द्वारा निर्दिष्ट किसी भी वर्ग को तुलनात्मक विस्तार करना होगा।

public class Tuple<? extends Comparable> { 
} 
+0

मुझे एहसास है कि आपने ट्यूपल की मूल जेनेरिक घोषणा को देखे बिना इसे लिखा है, इसलिए मैं ए और बी पैरामीटर को खोने के लिए आपको दोष नहीं दे सकता। लेकिन फिर भी, यह एक चेतावनी का कारण बन जाएगा क्योंकि आपने तुलनात्मक पैरामीटर नहीं किया है। –

7

आप

public class Tuple<A extends Comparable<? super A>, 
        B extends Comparable<? super B>> { ... 

के रूप में वर्ग की घोषणा तो सुनिश्चित करता है कि दोनों ए और बी आत्म तुलनीय है। इसके बाद आप श्रेणी में ए या बी के किसी ऑब्जेक्ट पर compareTo() पर कॉल कर सकते हैं।