मुझे बाद में संग्रह में प्रतिबिंबित मानचित्र में हुए परिवर्तनों के बिना जावा हैश मैप से संग्रह प्राप्त करने की आवश्यकता है। मैं इसे प्राप्त करने के लिए Collection.toArray() का उपयोग करना चाहता था, लेकिन यह काम नहीं कर रहा था। परिणामी ऑब्जेक्ट [] भी बदल रहा है (javadocs का कहना है कि लौटा सरणी "सुरक्षित" होगी जिसमें इस संग्रह द्वारा इसका कोई संदर्भ नहीं रखा जाता है)। इसे हासिल करने का कोई आसान तरीका?जावा हैश मैप से एक अपरिवर्तनीय संग्रह कैसे प्राप्त करें?
उत्तर
एक एकल एपीआई कॉल के साथ ऐसा करना संभव नहीं है, आपको गहरी क्लोनिंग का उपयोग करने की आवश्यकता है। जब आप मूल में परिवर्तन करते हैं तो क्लोन नहीं बदले जाएंगे। इस विषय पर पहले एसओ पर चर्चा की गई है, How to clone ArrayList and also clone its contents? और Deep clone utility recomendation देखें।
मुझे लगता है कि यह उत्तर विस्तारित किया जा सकता है: "गहरे क्लोन" का क्या अर्थ है और यह संशोधनों या "साझा संदर्भ" को कैसे रोकता है? एक लिंक उपयोगी हो सकता है ... –
@ धारणा: संपादन के लिए धन्यवाद। –
एनपी, और अच्छा जवाब। – Perception
Google collections Immutable Map आपकी मदद कर सकता है।
Collections.unmodifiableMap देखना भी
के लिए धन्यवाद यह * निहित * वस्तुओं की व्यवहार्यता के बारे में कुछ भी नहीं कहता है। –
मेरा मानना है कि Google संग्रह अपरिवर्तनीय मानचित्र ओपी की तलाश में है। @pst: प्रलेखन की मेरी पढ़ाई मुझे विश्वास दिलाती है कि com.google.common.collect.ImmutableMap में निहित वस्तुएं अपरिवर्तनीय हैं। –
मेरी समझ भी एक ही है –
आप एक unmodifiable Map
देखें यह * निहित * वस्तुओं की व्यवहार्यता के बारे में कुछ भी नहीं कहता है। –
मूल मानचित्र में परिवर्तन का उल्लेख नहीं करना प्रतिलिपि में प्रतिबिंबित होता है। – Perception
मेरा मानना है कि जस्टिन सही है। 'unmodifiableMap' विधि मानचित्र के केवल पढ़ने के दृश्य को वापस लाएगी जो बेस कंटेनर में किसी भी बदलाव को प्रतिबिंबित करेगी और sanre6 ने यह निर्दिष्ट नहीं किया है कि निहित वस्तुओं को असंभव होना चाहिए, केवल नक्शा होना चाहिए। – Francois
निम्नलिखित अभी भी मान्य है और इस मुद्दे को (प्रति किस तरह किया जाता है पर थोड़ा देखें) मनाया वर्णन करता है बना सकते हैं। हालांकि, मैं गहरी प्रतिलिपि करने के लिए पर पर कोई उत्तर नहीं देता हूं।
इसके बजाय, मेरा सुझाव, वस्तुओं को immutable पर डिज़ाइन करना है, जो इस समस्या को पूरी तरह से टालता है। मेरे अनुभव में यह सबसे छोटी वस्तुओं (यानी, वस्तुओं "कंटेनर" नहीं हैं) के लिए वास्तव में अच्छी तरह से काम करता है और इसके बारे में कोड और तर्क को सरल बना सकता है।
जावाडोक से HashMap.values
के लिए:
इस नक्शे में निहित मूल्यों की एक संग्रह को देखने देता है। संग्रह नक्शे के द्वारा समर्थित है, तो नक्शा करने के लिए परिवर्तन संग्रह, और उपाध्यक्ष प्रतिकूल में परिलक्षित होते हैं ...
शायद यह यह की एक प्रतिलिपि बनाने के लिए फायदेमंद हो सकता है?
HashMap<K,V> map = ....;
List<V> values = new ArrayList<V>(map.values());
, यही कारण है कि संक्षेप में, एक shallow-copy है कि "अब अलग" प्रदर्शन करती है। हालांकि, उथली प्रति होने के कारण, निहित वस्तुओं की कोई क्लोन/प्रति नहीं की जाती है। (Ǥʋяʋиɢ के जवाब βнɛƨн कर देखें कि कहीं deep-copy अर्थ विज्ञान वांछित रहे हैं: सवाल ही इस मामले पर एक छोटे से अस्पष्ट लगता है।)
मुबारक कोडिंग
मैंने वही किया, यह काम नहीं करता है। नई सूची में परिवर्तनों को प्रतिबिंबित किया जा रहा है साथ ही – sanre6
@ sanre6 "परिवर्तन" से आपका मतलब है "संग्रह * में ** वस्तुओं * में परिवर्तन *"? (जैसा कि "संग्रह * में परिवर्तन * के विपरीत है।) यदि ऐसा है, तो उथले/गहरी प्रतियों के लिंक देखें, जो मनाए गए व्यवहार की व्याख्या करते हैं, और βнɛƨн Ǥʋяʋиɢ से उत्तर। –
हाँ वास्तव में निहित वस्तुओं में बदल जाता है – sanre6
HashMap.clone()
whith मूल नक्शे के एक उथले प्रतिलिपि बनाएं, फिर पुनः प्राप्त मूल्यों से colleation उस। यह clone()
कॉल के समय मूल मानचित्र में ऑब्जेक्ट्स के लिए नए संदर्भ बनाएगा; स्पष्ट रूप से निहित वस्तुओं के अंदर परिवर्तन स्वयं कॉपी किए गए संग्रह में दिखाई देंगे। यदि आप यह व्यवहार चाहते हैं, तो आपका एकमात्र तरीका नक्शा ऑब्जेक्ट्स को वांछित संग्रह में कॉपी करना है।
- 1. एक अपरिवर्तनीय मैप
- 2. जावा, हैश मैप
- 3. जावा कंसूरेंट हैश मैप
- 4. जावा - हैश मैप में कुंजी का सूचकांक प्राप्त करें?
- 5. हैशसेट/हैश मैप जावा
- 6. हैश मैप जटिलता प्राप्त करें/डाल दें
- 7. स्ट्रिंग टू हैश मैप जावा
- 8. हैश मैप
- 9. सी # जावा हैश मैप समकक्ष
- 10. हैश मैप
- 11. जावा हैश मैप बनाम JSONObject
- 12. हैश मैप
- 13. जावा में एक मानचित्र (हैश मैप) के एक गणना (कुंजी के लिए) प्राप्त करें?
- 14. हैश मैप
- 15. AutoCompleteTextView onItem हैश मैप
- 16. एक गहरी अपरिवर्तनीय संग्रह कैसे बनाएं?
- 17. जावा में हैश मैप को कैसे क्रमबद्ध करें
- 18. हैश मैप
- 19. एक हैश मैप तत्व में स्ट्रिंग कैसे संलग्न करें?
- 20. हैश मैप
- 21. कस्टम हैश मैप कार्यान्वयन
- 22. एंड्रॉइड पर हैश मैप कैसे स्टोर करें?
- 23. जावा हैश मैप या पहचान हैशैप
- 24. हैश मैप
- 25. हैश मैप
- 26. जावा हैश मैप आइटम को हैश मैप या हैशटेबल में कैसे करता है?
- 27. जावा स्टैक ओवरव्लो एररलिस्ट को हैश मैप
- 28. जावा हैश मैप: इंडेक्स द्वारा कुंजी और मूल्य कैसे प्राप्त करें?
- 29. हैश मैप से चाबियों की सूची कैसे वापस करें?
- 30. ConcurrentModificationException और एक हैश मैप
मुझे स्पष्ट रूप से समझ में नहीं आया कि आप क्या हासिल करने की कोशिश कर रहे हैं। लेकिन क्या आप लिंक्ड हैशैप क्या खोज रहे हैं? – batbaatar
नहीं .. सम्मिलन का आदेश वह नहीं है जिसे मैं ढूंढ रहा हूं। मान लें कि हमारे पास का हैश मैप है। हैशमैप.वैल्यूज() मुझे एक संग्रह वापस कर देगा।अब हैश मैप में किसी भी बदलाव को इस संग्रह में प्रतिबिंबित किया जा रहा है, साथ ही यह डिफ़ॉल्ट व्यवहार है .पर, मुझे एक निश्चित संग्रह की आवश्यकता है जहां मानचित्र में कोई भी परिवर्तन –
sanre6
@ sanre6 परिलक्षित नहीं होगा क्या आपका मतलब है * आइटम * (ऑब्जेक्ट्स) में परिवर्तन मौके से हैश मैप निहित है? –