2012-08-30 11 views
7

मैं अभी भी ईएमएफ में एक नौसिखिया हूं इसलिए शायद मेरा प्रश्न वास्तव में समझ में नहीं आता है या मैं गलत चीजें मानता हूं।ईऑब्जेक्ट के बीच समानता की तुलना कैसे करें जब वे अनियंत्रित ईलीस्ट थे?

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

मैंने अपने परीक्षण करने के लिए EcoreUtil.equals() का उपयोग करने की कोशिश की लेकिन यह हमेशा झूठी वापसी करता है क्योंकि मेरी वस्तुओं में सूचियों (कक्षा ईएलआईस्ट) में संदर्भ होते हैं जिन्हें वैसे ही आदेश नहीं दिया जाता है। हालांकि, मैंने स्पष्ट रूप से अपने मेटामोडेल में परिभाषित किया है कि संदर्भों का आदेश नहीं दिया गया है: मैं उन्हें सूची से सेट की तरह अधिक उपयोग करना चाहता हूं।

तो, मैंने आखिरकार अपने जेनेरेटेड * इम्प्ल क्लास में अपने स्वयं के बराबर तरीकों को लागू करने का फैसला किया, भले ही यह जावाडोक में निराश हो, लेकिन यह एक और तरीका है, और अधिक सुरुचिपूर्ण, ईएमएफ वस्तुओं के बीच संरचनात्मक समानता का परीक्षण करने के लिए सूचियों का क्रम खाता है?

धन्यवाद!

उत्तर

2

आप अपनी खुद की कक्षाओं को लागू कर सकते हैं जहां आप EObject डिफ़ॉल्ट बराबर विधि का उपयोग करके अनियंत्रित सूचियों के लिए अपनी तुलना को कोड करते हैं।

आप EqualityHelper.equals(List list1, List list2) में अपने कार्यान्वयन को आधार के अनुसार इंडेक्स द्वारा जाने के बजाय "शामिल" सूची का उपयोग करके आधारभूत कर सकते हैं।

0

मैं Xtend में निम्नलिखित उपयोगिता तरीकों लिखा है:

static def boolean equalsTo(Set<? extends EObject> eObjectSet1, Set<? extends EObject> eObjectSet2) { 
    contains(eObjectSet1, eObjectSet2) && contains(eObjectSet2, eObjectSet1) 
} 

static def boolean contains(Set<? extends EObject> eObjectSet1, Set<? extends EObject> eObjectSet2) { 
    eObjectSet1.forall[eObject1 | eObjectSet2.exists[eObject2 | EcoreUtil.equals(eObject1, eObject2)]] 
} 
+0

मुझे एक्सटेन्ड नहीं पता है, लेकिन मेरे लिए ऐसा लगता है कि यह कोड सूचियों में डुप्लिकेट तत्वों को ध्यान में रखता नहीं है। तो '[1]' और '[1, 1, 1]' बराबर के रूप में रिपोर्ट किया जाएगा। – Lii

0

यह शायद, एक EMap का उपयोग कर उदाहरण EString के लिए कुंजी और एक मनमाना अन्य प्रकार के रूप में पूर्व सूची के तत्व के साथ, द्वारा हल किया जा सकता है, मूल्य के रूप में

यदि कोई तत्व सेट में होना चाहिए, तो इसे खाली स्ट्रिंग पर मैप करें।

EMap<SomeClass, EString> someSet; 

सूची, कई तत्वों को रोकने के और पूर्णांक है कि तत्वों की संख्या देता यह मैप कर सकते हैं।