2011-10-20 18 views
5

नहीं समझ सकता मुझे अपने हैश मैप्स की एक अलग प्रति प्राप्त करने में परेशानी हो रही है। इसका मतलब है, एक बार जब मैंने मूल की एक प्रति बना ली है, तो एक में बदलाव करने से दूसरे को नहीं बदला जाता है।हैश मैप प्रतिलिपि व्यवहार मैं

HashMap<String, List<String> one = new HashMap<String, List<String>(); 
HashMap<String, List<String> two = new HashMap<String, List<String>(); 

मैं नीचे निम्नलिखित समारोह (getTabSetDifferences) एक और दो में गुजर, जैसे कि अपेक्षित वहाँ कुछ मतभेद हैं, उन मूल्यों HashMap से निकाल दिया जाएगा कॉल:

मैं इस प्रारूप में दो HashMaps है और यह परीक्षण के लिए पारित होने से पहले अलग होगा।

मैं उन्हें अपरिवर्तित ही रहेंगे चाहते हैं, इसलिए में passsing की कोशिश की:

getTabSetDifferences((HashMap)one.clone(), (HashMap)two.clone()) 

यह अभी भी मूल बदल गया है, तो मैं एक ही प्रारूप में दो और HashMaps बनाया है, और एक और दो उन्हें क्लोन, मैं प्रयोग किया जाता है नए हैशैप्स पास करने के लिए, और मूल अभी भी बदल गया था।

मैं तो कोशिश की:

HashMap<String, List<String>> holdOne = new HashMap<String, List<String>>(); 
holdOne.putAll(one); 

HashMap<String, List<String>> Holdtwo = new HashMap<String, List<String>>(); 
holdTwo.putAll(two); 

अब मैं कुछ ऐसा कर सकते हैं: नहीं बदला गया है

holdTwo.remove(key); 

और मूल है, लेकिन अगर मैं holdOne साथ विधि और holdTwo फोन यह अभी भी बदल जाता है मूल एक और दो हैशपैप्स, क्या वे नहीं रहना चाहिए? विधि काम कर रही है, और अंतर जो मैं चाहता हूं, ढूंढ रहा हूं, और वापस आ गया है। लेकिन मुझे अभी भी मूल दो हैशैप्स की आवश्यकता है, लेकिन इससे कोई फर्क नहीं पड़ता कि जिस तरह से मैं कॉल करता हूं, पकड़ने के लिए कभी भी बदलाव किए जाते हैं और पकड़ते हैं दो मूल को बदलते हैं। क्या यह अपेक्षित व्यवहार है? यदि हां, तो का उचित तरीका क्या है जो हैशपैप की एक प्रति प्राप्त करने के लिए है जो उससे बंधे नहीं है।

getTabSetDifferences(holdOne, holdTwo); 

public HashMap<String, List<String>> getTabSetDifferences(HashMap<String, List<String>> hmMain, HashMap<String, List<String>> hmSecond) { 
    HashMap<String, List<String>> hmDifferences = new HashMap<String, List<String>>(); 
    for (Map.Entry<String, List<String>> entry : hmMain.entrySet()) { 
     if(hmSecond.containsKey(entry.getKey())) { 
      entry.getValue().removeAll(hmSecond.get(entry.getKey())); 
      if (entry.getValue().size() > 0) 
       hmDifferences.put(entry.getKey(), entry.getValue()); 
     } 
     else { 
      hmDifferences.put(entry.getKey(), entry.getValue()); 
     } 
    } 
    return hmDifferences; 
} 
+0

आपकी व्याख्या अपेक्षाकृत अस्पष्ट है। मुझे समझ में नहीं आता कि आप क्या करने की कोशिश कर रहे हैं और यह – Bozho

+0

में विफल कैसे होता है यह वास्तव में असफल नहीं होता है। मैं अपने दो मूल हैश मैप्स को बरकरार रखना चाहता हूं। विधि getBabSetDifferences हैश मैप्स में से किसी एक के अंतर को हटा देता है। मैं एक प्रतिलिपि में गुजरना चाहता हूं, इसलिए मूल अपरिवर्तित है, लेकिन मैं यह नहीं समझ सकता कि एक प्रतिलिपि कैसे बनाई जाए, जो मूल से जुड़ी नहीं है। – Green

उत्तर

2

क्लोन विधि एक गहरी प्रति नहीं करता है।

आपके पास 2 विकल्प हैं।

  1. एक गहरी प्रतिलिपि विधि पैदा करते हैं।
  2. उपयोग copyOnWrite
+1

मैंने अपनी गहरी प्रतिलिपि विधि लिखी। अच्छा काम कर रहा हूँ दिशा के लिए धन्यवाद। – Green

2

मुझे संदेह है कि आप केवल चाबियाँ/मानों की प्रतिलिपि बना रहे हैं। यह सूचियों की प्रतियां नहीं बनाएगा।

शायद गुवा का मल्टीमैप आप क्या चाहते हैं?

2

तरह java.util.concurrent पैकेज से मानचित्र कार्यान्वयन में से एक आप एक सूची के रूप में सूची की प्रतिलिपि बनाते हैं (यानी सूची दायरे में इसे कॉपी, बल्कि कुछ निचले स्तर कार्यान्वयन की तुलना में) , तो सूचक व्यवहार देखा जाएगा .... हालांकि यदि आप एक सूची से एक नई सूची में प्रतिलिपि बनाते हैं, तो उन स्ट्रिंग ऑब्जेक्ट्स स्वतंत्र हैं।

जावा की क्लोन विधि को उम्मीद में उपयोग नहीं किया जाना चाहिए कि यह किसी ऑब्जेक्ट की अलग, गहरी प्रतियां लौटाएगा - अपरिवर्तनीयता क्लोन के काम के तरीके के लिए एक केंद्रीय अवधारणा नहीं है।

मैं उपर्युक्त टिप्पणी से सहमत हूं: या तो गुवा, या Google संग्रह जैसी लाइब्रेरी में एक मल्टीमैप का उपयोग करें, या बस अपनी प्रतिलिपि के बारे में बहुत सावधान रहें, और केवल आदिम स्तरों पर प्रतिलिपि बनाएं, (किसी संग्रह को कॉपी न करें और उम्मीद है कि यह स्वतंत्र हो) जब तक कि आपने इसका स्पष्ट रूप से परीक्षण नहीं किया हो।

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