2010-01-05 17 views
6

का उपयोग करना हाय मुझे ArrayList या HashMap का उपयोग करने के बारे में कोई सवाल है।ऐरेलिस्ट या हैश मैप

मैं एक पेंट प्रोग्राम बनाने की कोशिश कर रहा हूं। प्रत्येक खींची गई वस्तु को एक अद्वितीय ऑब्जेक्ट ID असाइन किया जाएगा।

यदि मैं किसी ऑब्जेक्ट पर क्लिक करते समय तेज़ पुनर्प्राप्ति गति चाहता हूं, तो क्या मुझे arraylist या hashmap का उपयोग करना चाहिए?

सामान्य हैशप में ओ (1) है जबकि सरणीसूची में ओ (एन) पुनर्प्राप्ति गति है।

हालांकि, मुझे लगता है कि जब मैं किसी ऑब्जेक्ट पर क्लिक करता हूं, तो मुझे आईडी मिल जाएगी, इसलिए सरणी का सूचकांक और मैं ArraylistObject.get (ithElement) जैसे कुछ कर सकता हूं; , तो इस मामले में यह ओ (1) पुनर्प्राप्ति प्रक्रिया भी होगी?

कोई इनपुट?

धन्यवाद!

+0

क्या आपकी आईडी सरणी में आपकी अनुक्रमणिका के समान है? –

उत्तर

6

यदि ऑब्जेक्ट्स में एक आईडी है जिसे एक सरणी में 1-से-1 मैप किया जा सकता है, तो यह ओ (1) एक्सेस भी होगा, और अभ्यास में हैशपैप लुकअप से थोड़ा तेज़ होगा (आपके पास नहीं है हैश की गणना करने के लिए)।

हालांकि, समस्या तब होगी जब आप कोई ऑब्जेक्ट हटाते हैं। आपको सूची में एक छेद के साथ छोड़ दिया जाएगा। नई ऑब्जेक्ट्स बनाते समय आप सूची में शामिल रह सकते हैं और इसे धीरे-धीरे अधिक खंडित करने के लिए छोड़ सकते हैं या एक स्पेस स्लॉट ढूंढने की कोशिश कर सकते हैं, इस मामले में आप एक स्पेस स्पेस के लिए ओ (एन) खोज करेंगे।

संक्षेप में - हैशपैप शायद अधिक उपयुक्त है।

+2

यदि यह जावा संग्रह में एक ऐरेलिस्ट है, तो किसी ऑब्जेक्ट को हटाने के बाद भी सरणी संगत होनी चाहिए (कार्यान्वयन विवरण भूल जाएं)।हालांकि, यदि ऑब्जेक्ट आईडी सरणी इंडेक्स के समान है, तो व्यवहार एक निश्चित वस्तु को हटाने के बाद भी वीरडर होगा, आईडी एक पूरी नई ऑब्जेक्ट को इंगित करना शुरू कर सकती है क्योंकि सब कुछ अंतर को भरने के लिए बदल जाता है। तो निश्चित रूप से एक हैश मैप। – Anurag

+0

क्षमाप्रार्थी, भूल गए कि जब कोई तत्व हटा दिया जाता है (जब मैंने जावा किया था तब से कुछ समय बाद ArrayList अंतर्निहित सरणी को फिर से बदल देता है), लेकिन हाँ आपका बिंदु बहुत मान्य है कि संदर्भ तब खराब हो जाएंगे। – Paolo

+0

आईडी के रूप में आईडी का उपयोग करने का पूरा बिंदु यह है कि आप प्रविष्टियों को हटा नहीं पाएंगे, लेकिन उन्हें शून्य पर सेट करेंगे। –

1

प्लस साइड पर, आप ArrayLists को सही करके थोड़ा अतिरिक्त प्रदर्शन निचोड़ने में सक्षम हो सकते हैं। लेकिन वस्तुओं को हटाने का शाही दर्द होने वाला है - जैसे पाओलो और अनुराग ने कहा, आपको या तो खाली प्लेसहोल्डर (शून्य?) डालना होगा या अंतर को भरने के लिए किसी अन्य वस्तु को फिर से रखना होगा। यह प्रदर्शन कीड़े और सादे पुरानी बग्स के परिणामस्वरूप होने की संभावना है। दूसरी तरफ

हैशमैप्स। उपयोग करने में आसान, सभ्य प्रदर्शन की गारंटी (जब तक आप अपनी आईडी को वास्तव में बुरी तरह आवंटित नहीं करते)।

और आईडी द्वारा ऑब्जेक्ट्स को पुनर्प्राप्त करने से आपके एप्लिकेशन की बाधा बिल्कुल नहीं हो सकती है। जैसा कह रहा है, समयपूर्व अनुकूलन सभी बुराई की जड़ है।

1

हैं आप गारंटी ले सकते हैं कि आईडी एक अपेक्षाकृत छोटे संख्यात्मक रेंज में हो जाएगा, तो आप बल्कि एक ArrayList से एक सादे सरणी (आकार अधिकतम आईडी को preinitialized के साथ) का उपयोग करना चाहिए। यह सुनिश्चित करता है कि आप गलती से प्रविष्टियों को हटाएं और अंतराल को भरने के लिए सबकुछ बदल दें, गलत इंडेक्स पर समाप्त होने वाली सबकुछ के साथ। एक सादे सरणी भी एक ArrayList से थोड़ा तेज होगा।

यदि आप ऐसी गारंटी नहीं दे सकते हैं, तो हैश मैप का उपयोग करें। यह बहुत ही असंभव है कि गति अंतर ध्यान देने योग्य होगा, और इसे बनाए रखना आसान होगा।

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