2011-01-15 12 views
10

मैं दो मैप्स कि वस्तुओं के एक ही प्रकार के होते हैं है:संघ नक्शे

Map<String, TaskJSO> a = new HashMap<String, TaskJSO>(); 
Map<String, TaskJSO> b = new HashMap<String, TaskJSO>(); 

public class TaskJSO { String id; } 

नक्शा कुंजी "आईडी" गुण हैं।

a.put(taskJSO.getId(), taskJSO); 

मैं के साथ एक सूची प्राप्त करने के लिए करना चाहते हैं: "मानचित्र एक" कि "ख मानचित्र" + सभी मूल्यों में सभी मान "मानचित्र ख" नहीं कर रहे हैं।

सबसे तेज़ इस ऑपरेशन को करने का तरीका क्या है?

धन्यवाद

संपादित करें: comparaison आईडी द्वारा किया जाता है। इसलिए, दो कार्यजेएसओ को बराबर माना जाता है यदि उनके पास एक ही आईडी है (बराबर विधि ओवरराइड है)।

मेरा इरादा यह जानना है कि इस ऑपरेशन को प्रदर्शन बिंदु से करने का सबसे तेज़ तरीका कौन सा है।

Map<String, TaskJSO> ab = new HashMap<String, TaskJSO>(a); 
ab.putAll(b); 
ab.values() 

या मैं (के रूप में निशांत ने सुझाव दिया) एक सेट का उपयोग करता है, तो बजाय:

Set s = new Hashset(); 
s.addAll(a.values()); 
s.addAll(b.values()); 
उदाहरण के लिए, कोई फर्क अगर मैं एक नक्शे में "comparaison" करते हैं (के रूप में पीटर ने सुझाव दिया है)
+0

शायद इस पर निर्भर करता है कि आप किस जावा कार्यान्वयन का उपयोग कर रहे हैं। – Thomas

+0

मानचित्र 'ए' में एक' टास्कजेएसओ 'के लिए' आईडी 'मानचित्र और मानचित्र' बी' में एक अलग 'टास्कजेएसओ' हो सकता है? – dkarp

+0

@dkarp हां, एक ही आईडी मैप ए और मैप बी में दो अलग-अलग टास्कजेएसओ को मैप कर सकती है (वे एक ही इकाई के विभिन्न संस्करणों को स्टोर करते हैं) –

उत्तर

11

विधि 1:

Set s = new HashSet(); 
s.addAll(a.values()); 
s.addAll(b.values()); 

सेट अद्वितीय वस्तुओं का संग्रह है। देखें: http://download.oracle.com/javase/1.4.2/docs/api/java/util/HashSet.html


विधि 2:

This कुंजी की तुलना करेंगे, और यदि एक ही कुंजी पाए जाते हैं - मूल्य बाद में मानचित्र के मूल्य द्वारा ओवरराइट किया जाएगा।

Map<String, TaskJSO> ab = new HashMap<String, TaskJSO>(a); 
ab.putAll(b); 
ab.values() 

अब, चाहे मामला है क्या ... तुलना जगह equals का उपयोग कर ले जाएगा। तो, विधि -1 सभी मानों पर equals पर कॉल करेगा और Method2 इसे सभी चाबियों पर कॉल करेगा। इस पर निर्भर करता है कि तुलना कितनी जटिल है प्रदर्शन प्रदर्शन अलग-अलग होगा।

विधि 1 में, आपको एक नया सेट बनाने की आवश्यकता है, लेकिन यह सुनिश्चित करता है कि एक ही कुंजी के साथ अलग-अलग मान ओवरविटेड नहीं हैं। लेकिन यदि आपके पास अद्वितीय आईडी हैं तो विधि -2 स्मार्ट है। प्रश्न के रूप में

# संपादित करें 1 अपडेट

+0

मुझे लगता है कि ओपी निर्दिष्ट क्रम में ऑर्डर की गई सूची में तत्व चाहता था। क्या यह दृष्टिकोण ऐसा करने के लिए अनुकूलित किया जा सकता है? – templatetypedef

+0

ओपी आदेश का उल्लेख नहीं करता है। लेकिन आदेश वैसे भी गड़बड़ होगा। सामान्य तत्व के लिए, किस सेट का ऑर्डर पसंद किया जाता है? उदाहरण - ए: {1,2,3}, बी: {2,4,5}, एक संघ बी: {1,2,3,4,5} या {1,3,2,4,5}, बी संघ ए: {2,4,5,1,3} या {4,5,1,2,3}? मेरा मतलब है कि आप बेहतर इसे तुलनात्मक बनाते हैं और आदमी को सॉर्ट करते हैं! :) – Nishant

+1

हैश मैप एक अनियंत्रित मानचित्र है। आदेश बनाए रखने की कोशिश करने से ज्यादा समझ नहीं आएगी। –

2

अद्यतन किया गया था मुझे लगता है कि इस प्रकार आप रैखिक समय में ऐसा कर सकते हैं। n और m क्रमशः a और b में तत्वों की संख्या होने दें।

  1. एक नया HashSetb से सभी मूल्यों से युक्त बनाने के लिए। समय ओ (एम) है।

  2. b से सभी मूल्यों को एक नई सूची में जोड़ें। समय ओ (एम) है।

  3. a में प्रत्येक मान के लिए, जाँच करें कि क्या b में मूल्यों के HashSet उस तत्व शामिल हैं। यदि ऐसा है, तो कुछ भी नहीं। अन्यथा, इसे सूची में जोड़ें। समय ओ (एन) है।

यह ओ (एन + एम) समय से अधिक नहीं है, जो रैखिक है।

9

यदि आप बी प्लस से सभी महत्वपूर्ण/मूल्यों को सभी मानों में चाहते हैं, तो बी में नहीं।

Map<String, TaskJSO> ab = new HashMap<String, TaskJSO>(a); 
ab.putAll(b); 

ए की एक प्रति के साथ शुरू होता है और बी से सभी कुंजी/मूल्यों को प्रतिस्थापित करता है या जोड़ता है।

+0

मुझे नहीं लगता कि यह काम करने जा रहा है। ओप कहता है कि 'एक ही आईडी मैप ए और मैप बी में दो अलग-अलग टास्कजेएसओ को मैप कर सकती है।' इसका मतलब है कि 'ab.putAll (बी) 'विफल होगा यदि' a' और 'b' में एक ही आईडी आईडी – ryanprayogo

+2

@ryanprayogo के साथ प्रविष्टियां हैं, तो असफल होने का आपका क्या मतलब है? 'ए' और 'बी' में एक ही कुंजी हो सकती है, putAll() उन मानों को छोड़ देगा जो 'बी' में थे जहां डुप्लीकेट होते हैं। –

+0

क्षमा करें, मैंने जो कहा वह अनदेखा करें। मुझे वास्तव में पहले सवाल नहीं मिला था। – ryanprayogo

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