2010-08-11 19 views
6

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

असल में, मुझे दो उदाहरणों के बीच अंतर खोजने की आवश्यकता है और यदि दोनों उदाहरणों में फ़ील्ड अलग हैं, तो मैं पहले उदाहरण से फ़ील्ड के मान को तीसरे उदाहरण (diff ऑब्जेक्ट) में कॉपी करूंगा।

मुझे लगता है कि मैं प्रतिबिंब का उपयोग कर सकता हूं, लेकिन कक्षाएं बहुत जटिल हैं और यह त्रुटि प्रवण हो सकती है।

+1

एचएम ... कोई दो जावा बीन्स समान नहीं हैं ... http://www.coffeeobsessed.net/wp-content/uploads/2010/02/kawa-java-beans.jpg –

उत्तर

1

public YourClass diff(YourClass other) { 
    // diff code here 
} 

या

public static YourClass diff(YourClass first, YourClass second) { 
    // diff code here 
} 

की तरह एक विधि लिख सकते हैं और कार्यान्वयन के आसपास कुछ इकाई परीक्षण लपेट दें।

प्रतिबिंब और अधिक जटिल लग सकता है लेकिन यह निम्न लाभ हैं: अगर परिवर्तित करने की

1) यह सामान्य हो सकता है और आप किसी भी वर्ग
2) यह नहीं होगा के साथ एक ही कोड काम कर सकते हैं कक्षा विकसित होती है।

आप प्रतिबिंब साथ जाना चाहते हैं, तो आप का उपयोग Class.getDeclaredFields() ("जावा वर्ग एपीआई 6" के लिए गूगल) कर सकते हैं वर्ग की सभी फ़ील्ड प्राप्त करने के लिए, और फिर आप फील्ड एपीआई का उपयोग प्राप्त कर सकते हैं किसी वस्तु के लिए मूल्य। यदि आप वास्तव में फैंसी बनना चाहते हैं, तो आपके पास एक स्थिर स्ट्रिंग [] "diffIgnoredFields" है और इसमें फ़ील्ड नाम शामिल हैं जिन्हें आप diff में अनदेखा करना चाहते हैं।

+1

-1। यह उत्तर वास्तव में चुनौतीपूर्ण भाग के लिए कोई कार्यान्वयन विवरण प्रदान नहीं करता है। –

+0

@ माइक, अब कैसे? – hvgotcodes

+0

@hvgotcoes, हाँ। मैं अपने downvote undid। "डिफ कोड यहां" diff कोड लिखने के बारे में एक प्रश्न का बहुत अच्छा जवाब नहीं था। –

2

यदि आप इसे सामान्य रूप से करना चाहते हैं तो प्रतिबिंब का उपयोग करने के अलावा कोई अन्य तरीका नहीं है। यदि आपके फ़ील्ड में गेटर्स हैं तो आप इसे equals विधि से तुलना कर सकते हैं। फिर आप संकलन समय पर खेतों को जानते हैं।

+2

यह एक कठिन समस्या है। चूंकि ऑब्जेक्ट्स वास्तव में छिपाने में पॉइंटर्स हैं, इसलिए किसी को एक ही ऑब्जेक्ट को इंगित करने वाले x.a और x.b के बीच अंतर करने में सक्षम होना चाहिए, और x.a और x.b दो अलग-अलग ऑब्जेक्ट्स को इंगित करते हैं, जो एक-दूसरे के बराबर होते हैं। वैसे, सदस्यों के सदस्यों और सदस्यों के सदस्यों को 'IComparable' ठीक से लागू करना चाहिए, या ऐसा कुछ। साथ ही, अलग-अलग कैलकुलेटर में शब्दकोशों की तुलना में कठिन समय होगा, मुझे लगता है। क्या दो शब्दकोश या सेट बराबर बनाता है? क्या उन्हें हुड के नीचे होना चाहिए? –

4

आपका प्रश्न थोड़ा अस्पष्ट है। सबसे पहले आपने "एक ही कक्षा के दो उदाहरण" कहा, फिर आपने कहा "कक्षाएं बहुत जटिल हैं"। क्या यह किसी भी वर्ग के उदाहरणों के बीच अंतर खोजने के लिए एक सामान्य समाधान है, या यह सिर्फ एक विशिष्ट मामला है? दूसरी अस्पष्टता का मतलब है कि "मतभेदों की प्रतिलिपि बनाएँ"। उदाहरण के लिए, यदि यह एक स्ट्रिंग है, तो अंतर क्या दो स्ट्रिंग्स के बीच नया उदाहरण में कॉपी किया जाएगा? यदि यह एक संग्रह है, तो संग्रह के बीच अंतर क्या है? क्या होगा यदि आपके पास दो ArrayLists हैं जिनके पास अलग-अलग ऑर्डर हैं।

यदि यह एक विशिष्ट मामला है, तो आप कक्षा में एक विधि बना सकते हैं जहां आप एक ही कक्षा के उदाहरण में पास करते हैं। फिर आप प्रत्येक क्षेत्र में पुनरावृत्त कर सकते हैं और मतभेदों की तुलना कर सकते हैं।

public TheClass difference(TheClass that) { 
    TheClass newClass = new TheClas() 
    if (this.getName().equals(that.getName()) == false) { 
    newClass.setName(that.getName()); 
    } 
    ... 
} 

लेकिन यह आपके ऑब्जेक्ट ग्राफ़ को कितना गहराई के आधार पर हाथ से बाहर निकल सकता है।

शायद यदि आप एक सामान्य/पुन: प्रयोज्य समाधान बनाने की कोशिश कर रहे हैं तो बिल्डर पैटर्न यहां आसान हो सकता है। आप अपाचे कॉमन्स कोड बेस देख सकते हैं और देख सकते हैं कि वे हैशकोडबिल्डर और ToStringBuilder को कैसे कार्यान्वित करते हैं। उनके पास उपयोगिता का प्रतिबिंब संस्करण भी है। देखें कि वे गहरे और उथले बराबर कैसे संभालते हैं।

+1

* "लेकिन यह आपके ऑब्जेक्ट ग्राफ़ को कितना गहरा है इस पर निर्भर करता है" * ... और पेड़ संरचित नहीं होने पर ग्राफ को और भी जटिल हो जाता है। –

0

आपको सावधान रहना होगा। इस समस्या के कुछ सूत्र अनिवार्य रूप से Subgraph Isomorphism Problem के समान हैं जो NP complete के रूप में जाना जाता है।

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