2012-08-01 17 views
5

में ऑब्जेक्ट्स पर अलग-अलग बराबर (भौतिक बराबर और तार्किक बराबर) रखने के लिए एक तंत्र क्या तुलनात्मक की तरह कोई तुल्यकारक तंत्र है, इसलिए सूचियों की प्रतिलिपि बनाने के लिए मेरे पास अलग-अलग बराबर हो सकते हैं?संग्रह

संपादित करें: मेरा लक्ष्य वर्तमान list1.equals (List2) जो की जाँच करता है के बीच अंतर करने के लिए है अगर इसकी एक उथले प्रतिलिपि या भी सभी वस्तुओं a.equals के साथ एक गहरी प्रतिलिपि (ख) और list1.identical (List2) जो जांचता है कि अगर इसकी अनमोल लिस्टिंग

के साथ इसकी बस उथली प्रतिलिपि है तो ये सभी सूचियां एक ही मॉडल से हैं। कुछ स्वयं की प्रतियां हैं, इसलिए वे पॉइंटर को एक ही ऑब्जेक्ट में रखते हैं, और अन्य गहरी प्रतियां हैं, इसलिए पदानुक्रम पूरी तरह से दोहराया जाता है, क्योंकि उनके पास संरचना में न केवल संरचना में अद्यतन होते हैं।

मुझे खुद को अक्सर makin list1.equals (list2) मिलती है, लेकिन मुझे यह बताने के लिए एक तंत्र की आवश्यकता है कि क्या दोनों कुल प्रतियां हैं (संग्रह के लिए एक ही क्रम में समान वस्तुएं) या कभी-कभी यदि वे भौतिक प्रतियां हैं (मेरे अपने कार्यान्वित तर्क के बराबर), तो सूची बराबर कॉल करेगी और ऑब्जेक्ट्स को == बी से कुछ और लागू करना चाहिए।

मेरे समस्या नहीं Equalator इंटरफेस है, और अगर मैं वस्तुओं को ओवरराइड मैं ढीला कुल बराबर (एक == ख)

उदाहरण के लिए द्वारा की तुलना करने की क्षमता के लिए, यह अच्छा होगा के बराबर होती है है;

Collections.equal(l1,l2,new Equalator(){ 
    @Override public boolean equals(Obj1,Obj2){ 
      //Default lists comparison plus commparison of objects based on 
      return (obj1.propertyX() == obj2.propertyX()); 
    } 
}); 

और अभी भी मैं कर सकता list1.equals (List2) तो वे डिफ़ॉल्ट बराबर का उपयोग करें (obj1 == obj2) और यह केवल सच हो सकता है अगर निहित वस्तुओं बिल्कुल वैसा ही कर रहे हैं।

पहला ऑपरेशन यह जांचने के लिए उपयोगी है कि सूची (जो मॉडल से पूरी तरह से पुनर्निर्मित वस्तुओं के साथ एक अद्यतन सूची हो सकती है) अभी भी पुरानी सूची के बराबर है।

दूसरा ऑपरेशन यह जांचने के लिए उपयोगी है कि सूची (जो डेटा मॉडल के पुराने वर्तमान संस्करण की उथली प्रतिलिपि थी) की जांच के लिए उपयोगी है, इसमें कोड के अंदर इसे स्थानांतरित करने से कोई असाधारण परिवर्तन नहीं होता है जब यह udpdated संस्करण था।

संपादित करें: एक बहुत अच्छा उदाहरण प्वाइंट (एक्स, वाई) की एक सूची होगी। हमें यह जानने में सक्षम होना चाहिए कि दोनों सूची बराबर हैं क्योंकि वे अंक या बराबर के समान सेट हैं क्योंकि उनके द्वारा बनाए गए बिंदु तार्किक तरीके से बराबर हैं। यदि हम वस्तु के लिए phyEqual और logEqual दोनों को कार्यान्वित कर सकते हैं, और किसी भी ऑब्जेक्ट में दोनों विधियों को सूचीबद्ध कर सकते हैं तो list.phyEqual (list2) या list1.logEqual (list2)

+0

आपके पास बहुत सारे संदर्भ हैं, लेकिन आपका वास्तविक * प्रश्न * यहां क्या है? –

+0

पहली पंक्ति। तब मैं अपनी समस्या को परिभाषित करता हूं। क्षमा करें, मैंने 'वहां है' के बजाय 'वहां नहीं है' के साथ शुरू किया और मुझे लगता है कि यही कारण है कि इसकी उलझन में – Whimusical

उत्तर

2

आपका प्रश्न वास्तव में स्पष्ट रूप से मेरे पास स्पष्ट रूप से नहीं आया है । यदि यह ठीक से इसका उत्तर नहीं देता है, तो क्या आप थोड़ा सा पुनः शब्द कर सकते हैं?

किसी दिए गए संग्रह ठोस प्रकार के भीतर, अधिकांश बराबर कार्यान्वयन पहले से ही करते हैं जो आप संकेत देते हैं। उदाहरण के लिए:

public boolean equals(Object o) { 
     if (o == this) 
      return true; 

इस मामले में, कुछ इस तरह मतलब हो सकता है।
आप आसानी से इसे ओवरराइड कर सकते हैं:

@Override 
    public boolean equals(Object o) { 
     if (o.getPrimaryKey() == this.getPrimaryKey()) 
      return true; 
     return super().equals(o); 

[nulls के लिए परीक्षण जोड़ा जाना चाहिए] आप मानक संग्रह का निर्माण कर रहे हैं, तो आप भी गुमनाम रूप से निर्माण के दौरान बराबर विधि ओवरराइड कर सकते हैं।

यदि यह वही नहीं करता है जो आप चाहते हैं, तो आप खुद को संग्रह बढ़ा सकते हैं और एक ही चीज़ करने के लिए किसी भी तरीके को ओवरराइड कर सकते हैं।

क्या इससे मदद मिलती है?

+0

कम से कम सूची है, दोनों बराबर है, दोनों सूचियों के समान आकार, समान तत्व और एक ही क्रम है। समस्या यह है कि यह कहने के लिए बराबर उपयोग करता है कि दोनों ऑब्जेक्ट समान हैं, तो इसका मतलब है कि एक बराबर इंटरफ़ेस के बिना, मुझे समानता की अतिरिक्त श्रृंखला रखने के लिए पूरे ढांचे को बदलना होगा। मैं अपने ऑब्जेक्ट्स में बराबर को तार्किक या शारीरिक बराबर के रूप में लागू कर सकता हूं, लेकिन फिर मैं अन्य प्रकार – Whimusical

+0

पर स्विथ नहीं कर सकता हूं। बहुत कम वास्तविक दुनिया के मामले हैं जिनमें समानता की एक से अधिक परिभाषाएं हैं जो वास्तव में किसी के लिए उपयोग की जाती हैं। –

+0

सूची। list.equals (list2) यदि दोनों के समान आकार, तत्व और क्रम हैं (खाता तत्वों को लेना बराबर है यदि वे a.equals (बी) को संतुष्ट करते हैं)। लेकिन list.equals2 (list2) का मतलब हो सकता है कि दोनों का आकार, तत्व और ऑर्डर दोनों (खाते में 2 ओबीजे लेना एक == बी) बराबर है। बेशक, यह मानते हुए कि हम a.equals (बी) को आश्वस्त नहीं कर सकते हैं, इसलिए अतिरंजित नहीं है इसलिए एक == बी से आगे नहीं जाता है – Whimusical

2

एक देर से जवाब है, लेकिन शायद यह किसी के लिए उपयोगी हो जाएगा ...

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

या आप अपने स्वयं के इंटरफेस रोल कर सकते हैं:

interface Equalator<T> { 
    boolean equals(T o1, T o2); 
} 

फिर से, आप अपने (तुच्छ) विधि

boolean <T> listEquals(List<T> list1, List<T> list2, Equalator<T> equalator) { 
    ... 
} 

लिखने की ज़रूरत है ... लेकिन फिर आप विभिन्न ListEqualator कार्यान्वयन के साथ यह पुनः उपयोग कर सकते ।

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