2012-06-25 14 views
13

में कोई अतिरिक्त विधि क्यों नहीं है Iterator में सूर्य ने संग्रह के अंतिम एक्सेस तत्व को निकालने के लिए निकाली विधि को जोड़ा। संग्रह में नया तत्व जोड़ने के लिए कोई अतिरिक्त विधि क्यों नहीं है? संग्रह या पुनरावर्तक के लिए इसका किस तरह के दुष्प्रभाव हो सकते हैं?इटरेटर इंटरफ़ेस

+0

मुझे लगता है कि आप एक दोहराव है: http://stackoverflow.com/questions/993025/java-adding-elements-to-a-collection-during-iteration – mihaisimi

+0

@mihaisimi - नहीं, यह है वास्तव में एक अलग सवाल है। –

+0

हां, आप सही हैं। अभी भी कोबर्ड ने उस धागे पर इसका अच्छा जवाब दिया है। – mihaisimi

उत्तर

10

एक इटरेटर का एकमात्र उद्देश्य संग्रह के माध्यम से गणना करना है। आपके संग्रह को पूरा करने के लिए सभी संग्रहों में add() विधि शामिल है। इटरेटर में जोड़ने में कोई बात नहीं होगी क्योंकि संग्रह आदेश दिया जा सकता है या नहीं (HashSet के मामले में)।

संपादित करें: एक और समस्या पर काम करते समय, मैं एक और कारण Iterator का अभाव है कि एक add() विधि के साथ आया था। ArrayList (लाइन 111), और HashMap (लाइन 14 9) के हुड के नीचे देख रहे हैं, हम देखते हैं कि कार्यान्वयन वस्तुओं की एक सरणी के आस-पास कुछ विधियां हैं। अब हम सोचते हैं कि स्मृति में सरणी का इलाज कैसे किया जाता है।

zero-based array indexes

यह 5 तत्वों की एक सरणी है। हालांकि, छह सूचकांक हैं। इस सरणी में अक्षर "ए" को तत्व 0 के रूप में सूचीबद्ध किया गया है क्योंकि इसे पढ़ने के लिए, कंप्यूटर की तरह बाएं से दाएं, आपको इंडेक्स 0 पर प्रारंभ करना होगा। अब, अगर हम इस सरणी के माध्यम से पुनरावृत्त कर रहे हैं (हाँ, संग्रह, लेकिन यह एक सरणी के लिए उबाल जाता है), हम सूचकांक 0 से शुरू करेंगे और सूचकांक 1 जारी रखें। इस बिंदु पर इटरेटर में, हम add("f"); पर कॉल करना चाहते हैं। इस बिंदु पर, चलिए add() और remove() के प्रभावों की तुलना करें। remove() सरणी में एक स्थान छोड़ देगा, जो कूदना आसान है, क्योंकि हम तुरंत पहचान सकते हैं कि यह सदस्य नहीं है। दूसरी तरफ, add() एक नया तत्व डालेगा जिसमें पहले नहीं था। यह उस सरणी की लंबाई को प्रभावित करेगा जिसे हम कर रहे हैं। क्या होता है जब हम उस अंतिम तत्व पर जाते हैं? क्या हम यह भी गारंटी दे सकते हैं कि यह वहां है (यानी, कि सरणी the maximum size से अधिक नहीं है)?

सब कुछ, तर्क एक तरफ या किसी अन्य के पास वैध अंक हैं, लेकिन नीचे की रेखा यह है कि add() विधि का व्यवहार सभी मामलों में अच्छी तरह परिभाषित नहीं है। सूर्य को कार्यक्षमता सीमित करने के लिए एक विकल्प बनाना था, और उन्होंने इस विधि को शामिल न करने का फैसला किया।

+0

"क्योंकि संग्रह आदेश दिया जा सकता है या नहीं भी" - क्या आप इसे थोड़ा विस्तारित करते हैं। धन्यवाद – droidsites

+0

मुझे आपका कथन मिला :-)। धन्यवाद – droidsites

+0

ए हैशसेट अपने सदस्यों के आदेश के लिए कोई गारंटी नहीं देता है। यदि आप किसी बिंदु को डालने के लिए उस बिंदु को खोजने का प्रयास करने के लिए इसके माध्यम से पुनरावृत्त कर रहे हैं, तो आपने अभी एक इटरेटर के बिंदु को हराया है। – gobernador

0

मैं किसी भी सैद्धांतिक कारण के बारे में नहीं सोच सकता कि add()Iterator में क्यों शामिल नहीं किया जा सका। जैसे Iterator तत्वों को संग्रह से हटाए जाने की अनुमति दे सकता है, इसे उसी तरह से जोड़े जाने वाले तत्वों को संभालने के लिए डिज़ाइन किया जा सकता है।

लेकिन मैं कहूंगा कि जावा में प्रोग्रामिंग के मेरे सभी वर्षों में - 15 से अधिक! - मैं कभी Iterator.add() विधि नहीं चाहता था। तो मुझे संदेह है कि यह बस इतना उपयोगी नहीं है।

5

यदि आप किसी सूची पर काम कर रहे हैं तो आप ListIterator का उपयोग कर सकते हैं जो दोनों को जोड़ और निकालें प्रदान करता है।

+3

वास्तव में सवाल का जवाब नहीं देता है। लेकिन हां, 'इटरेटर' 'add' लागू नहीं करता है क्योंकि यह 'ListIterator' नहीं है। – Robert

10

ठीक है, ये हम चले:

जवाब स्पष्ट रूप से डिजाइन पूछे जाने वाले प्रश्न में कहा गया है:

आप एक Iterator.add विधि क्यों प्रदान नहीं करते हैं?

अर्थशास्त्र अस्पष्ट हैं, यह देखते हुए कि इटरेटर के लिए अनुबंध पुनरावृत्ति के आदेश के बारे में कोई गारंटी नहीं देता है। नोट, हालांकि, ListIterator एक ऐड ऑपरेशन प्रदान करता है, क्योंकि यह पुनरावृत्ति के क्रम की गारंटी देता है।

http://docs.oracle.com/javase/1.4.2/docs/guide/collections/designfaq.html#10

0

इटरेटर अगले तत्व केवल करने के लिए एक सूचक है। जहां ListIterator के पिछले तत्व के पॉइंटर्स भी हैं (याद रखें, यह पीछे की तरफ जा सकता है)।