2012-01-28 17 views
8

मुझे बाद में संग्रह में प्रतिबिंबित मानचित्र में हुए परिवर्तनों के बिना जावा हैश मैप से संग्रह प्राप्त करने की आवश्यकता है। मैं इसे प्राप्त करने के लिए Collection.toArray() का उपयोग करना चाहता था, लेकिन यह काम नहीं कर रहा था। परिणामी ऑब्जेक्ट [] भी बदल रहा है (javadocs का कहना है कि लौटा सरणी "सुरक्षित" होगी जिसमें इस संग्रह द्वारा इसका कोई संदर्भ नहीं रखा जाता है)। इसे हासिल करने का कोई आसान तरीका?जावा हैश मैप से एक अपरिवर्तनीय संग्रह कैसे प्राप्त करें?

+0

मुझे स्पष्ट रूप से समझ में नहीं आया कि आप क्या हासिल करने की कोशिश कर रहे हैं। लेकिन क्या आप लिंक्ड हैशैप क्या खोज रहे हैं? – batbaatar

+0

नहीं .. सम्मिलन का आदेश वह नहीं है जिसे मैं ढूंढ रहा हूं। मान लें कि हमारे पास का हैश मैप है। हैशमैप.वैल्यूज() मुझे एक संग्रह वापस कर देगा।अब हैश मैप में किसी भी बदलाव को इस संग्रह में प्रतिबिंबित किया जा रहा है, साथ ही यह डिफ़ॉल्ट व्यवहार है .पर, मुझे एक निश्चित संग्रह की आवश्यकता है जहां मानचित्र में कोई भी परिवर्तन – sanre6

+0

@ sanre6 परिलक्षित नहीं होगा क्या आपका मतलब है * आइटम * (ऑब्जेक्ट्स) में परिवर्तन मौके से हैश मैप निहित है? –

उत्तर

9

एक एकल एपीआई कॉल के साथ ऐसा करना संभव नहीं है, आपको गहरी क्लोनिंग का उपयोग करने की आवश्यकता है। जब आप मूल में परिवर्तन करते हैं तो क्लोन नहीं बदले जाएंगे। इस विषय पर पहले एसओ पर चर्चा की गई है, How to clone ArrayList and also clone its contents? और Deep clone utility recomendation देखें।

+0

मुझे लगता है कि यह उत्तर विस्तारित किया जा सकता है: "गहरे क्लोन" का क्या अर्थ है और यह संशोधनों या "साझा संदर्भ" को कैसे रोकता है? एक लिंक उपयोगी हो सकता है ... –

+0

@ धारणा: संपादन के लिए धन्यवाद। –

+0

एनपी, और अच्छा जवाब। – Perception

8

Google collections Immutable Map आपकी मदद कर सकता है।

Collections.unmodifiableMap देखना भी

+2

के लिए धन्यवाद यह * निहित * वस्तुओं की व्यवहार्यता के बारे में कुछ भी नहीं कहता है। –

+1

मेरा मानना ​​है कि Google संग्रह अपरिवर्तनीय मानचित्र ओपी की तलाश में है। @pst: प्रलेखन की मेरी पढ़ाई मुझे विश्वास दिलाती है कि com.google.common.collect.ImmutableMap में निहित वस्तुएं अपरिवर्तनीय हैं। –

+1

मेरी समझ भी एक ही है –

2

आप एक unmodifiable Map

+0

देखें यह * निहित * वस्तुओं की व्यवहार्यता के बारे में कुछ भी नहीं कहता है। –

+2

मूल मानचित्र में परिवर्तन का उल्लेख नहीं करना प्रतिलिपि में प्रतिबिंबित होता है। – Perception

+0

मेरा मानना ​​है कि जस्टिन सही है। 'unmodifiableMap' विधि मानचित्र के केवल पढ़ने के दृश्य को वापस लाएगी जो बेस कंटेनर में किसी भी बदलाव को प्रतिबिंबित करेगी और sanre6 ने यह निर्दिष्ट नहीं किया है कि निहित वस्तुओं को असंभव होना चाहिए, केवल नक्शा होना चाहिए। – Francois

2

निम्नलिखित अभी भी मान्य है और इस मुद्दे को (प्रति किस तरह किया जाता है पर थोड़ा देखें) मनाया वर्णन करता है बना सकते हैं। हालांकि, मैं गहरी प्रतिलिपि करने के लिए पर पर कोई उत्तर नहीं देता हूं।

इसके बजाय, मेरा सुझाव, वस्तुओं को immutable पर डिज़ाइन करना है, जो इस समस्या को पूरी तरह से टालता है। मेरे अनुभव में यह सबसे छोटी वस्तुओं (यानी, वस्तुओं "कंटेनर" नहीं हैं) के लिए वास्तव में अच्छी तरह से काम करता है और इसके बारे में कोड और तर्क को सरल बना सकता है।


जावाडोक से HashMap.values के लिए:

इस नक्शे में निहित मूल्यों की एक संग्रह को देखने देता है। संग्रह नक्शे के द्वारा समर्थित है, तो नक्शा करने के लिए परिवर्तन संग्रह, और उपाध्यक्ष प्रतिकूल में परिलक्षित होते हैं ...

शायद यह यह की एक प्रतिलिपि बनाने के लिए फायदेमंद हो सकता है?

HashMap<K,V> map = ....; 
List<V> values = new ArrayList<V>(map.values()); 

, यही कारण है कि संक्षेप में, एक shallow-copy है कि "अब अलग" प्रदर्शन करती है। हालांकि, उथली प्रति होने के कारण, निहित वस्तुओं की कोई क्लोन/प्रति नहीं की जाती है। (Ǥʋяʋиɢ के जवाब βнɛƨн कर देखें कि कहीं deep-copy अर्थ विज्ञान वांछित रहे हैं: सवाल ही इस मामले पर एक छोटे से अस्पष्ट लगता है।)

मुबारक कोडिंग

+0

मैंने वही किया, यह काम नहीं करता है। नई सूची में परिवर्तनों को प्रतिबिंबित किया जा रहा है साथ ही – sanre6

+0

@ sanre6 "परिवर्तन" से आपका मतलब है "संग्रह * में ** वस्तुओं * में परिवर्तन *"? (जैसा कि "संग्रह * में परिवर्तन * के विपरीत है।) यदि ऐसा है, तो उथले/गहरी प्रतियों के लिंक देखें, जो मनाए गए व्यवहार की व्याख्या करते हैं, और βнɛƨн Ǥʋяʋиɢ से उत्तर। –

+0

हाँ वास्तव में निहित वस्तुओं में बदल जाता है – sanre6

0

HashMap.clone() whith मूल नक्शे के एक उथले प्रतिलिपि बनाएं, फिर पुनः प्राप्त मूल्यों से colleation उस। यह clone() कॉल के समय मूल मानचित्र में ऑब्जेक्ट्स के लिए नए संदर्भ बनाएगा; स्पष्ट रूप से निहित वस्तुओं के अंदर परिवर्तन स्वयं कॉपी किए गए संग्रह में दिखाई देंगे। यदि आप यह व्यवहार चाहते हैं, तो आपका एकमात्र तरीका नक्शा ऑब्जेक्ट्स को वांछित संग्रह में कॉपी करना है।

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