2013-09-04 12 views
5

मैं जावा में किसी वर्ग के लिए कस्टम इटरेटर को कार्यान्वित करने के तरीके के बारे में थोड़ा उलझन में हूं। मुझे अनिवार्य रूप से मेरे लिए पहले से उपलब्ध इनबिल्ट पुस्तकालयों का उपयोग किये बिना एक ऐरेलिस्ट बनाना आवश्यक है। मैं कक्षा बनाने की मूल बातें समझता हूं लेकिन मुझे यह समझने में परेशानी हो रही है कि इटरेटर को इन सब में फिट करने के लिए कैसे प्राप्त किया जाए। मैं निम्नलिखित है:कस्टम इटरेटर जावा बनाना?

मैं एक सामान्य वर्ग है कि इस तरह के रूप में iterable इंटरफ़ेस लागू करता है बनाया है यह कुछ इस तरह दिखता है:

public class MyArrayList<T> implements Iterable<T> { 

मैं तो जिसके अनुसार एक वर्ग कहा जाता MyIterator बनाने के लिए मिल गया है दस्तावेज़ का शब्द एक स्टैंड अकेले वर्ग है। यह काफी सीधे आगे लगता है मैं MyIterator नामक एक नया वर्ग बनाने के लिए और यह इटरेटर इंटरफ़ेस को लागू तो यह कुछ इस तरह दिखता है:

public class MyIterator<T> implements Iterator<T>{ 

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

मुझे उम्मीद है कि मदद करता है, जैसा कि मैंने कहा था कि मुझे लगता है कि मुझे लगता है कि मुझे समझ में आता है कि मुझे क्या चाहिए, मुझे बिल्कुल यकीन नहीं है कि मेरा इटरेटर इस सब में फिट बैठता है।

+0

'MyArrayList # इटरेटर()' 'रिटर्न नई MyIterator (यह)' या किसी भी तरह के लिए एक संदर्भ के लिए ही गुजरता है और जिससे डेटा – zapl

+0

लिए पहुँच देता है तो MyArrayList वर्ग के MyIterator हिस्सा है या यह सामान्य रूप से अपने आप में जाना है , यह वह जगह है जहां मैं उलझन में हूं, मुझे नहीं पता कि "कहाँ" इटरेटर चला जाता है, अगर यह कोई समझ में आता है। मुझे पता है कि इटेटरेटर() विधि क्या करना है, लेकिन मुझे नहीं पता कि मुझे अपने कस्टम इटरेटर के लिए कोड कहां जोड़ना चाहिए ताकि यह इसका एक उदाहरण बना सके और जब मुझे इसकी आवश्यकता हो तो उसे वापस कॉल करें। – Scott

उत्तर

6

जबकि इटरेटर को एक अलग वर्ग * होना चाहिए, उस वर्ग का शायद आपके Iterable वर्ग से कुछ संबंध होगा।

यह अक्सर घोंसला/आंतरिक वर्ग होता है, ठीक है क्योंकि इसे कक्षा के मूल्यों तक पहुंचने की आवश्यकता होती है (और यही वह है जो आंतरिक वर्गों के लिए बहुत अधिक है)।

, दी अगर Iterable एक List तुम किसी भी "आंतरिक" के उपयोग के बिना एक Iterator को लागू कर सकता है, लेकिन आप आमतौर पर अभी भी modCount (एक ConcurrentModificationException फेंकने के लिए जाँच जैसी चीजों के लिए आंतरिक के लिए उपयोग करना चाहते हैं जब Iterable संरचनात्मक रूप से संशोधित है जब आप इसे फिर से चालू करते हैं ... और को रोकें, अगर आप इसे Iterator के माध्यम से संशोधित करते हैं तो अपवाद)।

* यदि आप अपने Iterable उदाहरण के साथ ही इसे लागू कर सकता है, लेकिन उपयोगकर्ता एक ही समय में दो iterators का उपयोग करता है के रूप में है कि जैसे ही अनुबंध टूट जाएगा।

+0

तो अनिवार्य रूप से मैं एक निम्न के समान की स्थापना करना चाहते हैं: सार्वजनिक वर्ग MyArrayList Iterable लागू करता संपादित करें { सार्वजनिक वर्ग MyIterator इटरेटर { } लागू करता है}: माफ करना, मैं बाहर काम नहीं कर सकता टिप्पणियों में काम कर रहे कोड स्वरूपण कैसे प्राप्त करें। – Scott

+0

@gRnt बिल्कुल - इटरेटर कार्यान्वयन एक निजी वर्ग हो सकता है/हालांकि किसी को भी कक्षा को देखने की आवश्यकता नहीं है। पीएस: इसे टेक्स्ट में स्वरूपित करने के लिए कोड डालें। http://stackoverflow.com/editing-help#comment-formatting – zapl

+0

धन्यवाद, मुझे लगता है कि मैं घृणित वर्ग नहीं होने के कारण "यह अपनी कक्षा" को भ्रमित कर रहा था! – Scott

1

आपको अपनी खुद की विधियों hasNext(), next(), remove() घोषित करना होगा। यह जानना है कि कैसे अपनी खुद की कक्षा में पुन: प्रयास करें, अगले तत्व पर कैसे जाएं और यह जांचें कि अगला तत्व मौजूद है या नहीं।

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