2011-10-07 18 views

उत्तर

32

क्यों?

क्योंकि अगर आप एक रीसेट विधि हर इटरेटर एक रीसेट विधि होना आवश्यक है के लिए इटरेटर बाध्य करते हैं। यह हर पुनरावर्तक लेखक अतिरिक्त काम देता है। इसके अलावा कुछ इटरेटर रीसेट करने के लिए वास्तव में कठिन (या वास्तव में महंगा) हैं, और आप नहीं चाहते हैं कि उपयोगकर्ता उन पर रीसेट करें। फाइलों या धाराओं पर इटरेटर अच्छे उदाहरण हैं।

इटेटरेटर आइटम पॉइंटर को पहली स्थिति में स्थानांतरित करने का सबसे अच्छा तरीका क्या है?

नया इटरेटर बनाएं। रीसेट की तुलना में यह शायद ही कभी महंगा है।

+6

(इस तथ्य को छोड़कर कि 'निकालें' विधि है, जो * वास्तव में वास्तव में सभी इटरेटर "अतिरिक्त काम" नहीं देती है, क्योंकि ऑपरेशन वैकल्पिक है।) – aioobe

+0

@aioobe कुछ ऐसे मामले हैं जहां वर्तमान ऑब्जेक्ट को हटाया जा रहा है इटरेटर डेवलपर्स के लिए जीवन वास्तव में आसान बनाता है। बहुत कम मामले हैं जहां यह रीसेट के लिए सच है (क्योंकि आप लगभग हमेशा एक नया इटरेटर बना सकते हैं)। – DJClayworth

+1

@ डीजेक्लेवर्थ "यह हर पुनरावर्तक लेखक अतिरिक्त काम देता है।" यह एक उचित प्रतिक्रिया नहीं है। लाइब्रेरी कार्यान्वयन करने वालों को थोड़ा अतिरिक्त प्रयास करने की आवश्यकता है, लेकिन भुगतान यह है कि कई लाइब्रेरी उपयोगकर्ताओं को लाभ मिलेगा। – stackoverflowuser2010

3

सबसे अच्छा तरीका एक नया निर्माण करना है!

+1

ठीक उसी तरह से आप पिछले एक बनाया (जावा समान है, लेकिन मैं एक जावा आरईपीएल आसान नहीं है): = iteratable.iterator इटरेटर इटरेटर(); –

6

एक बार जब आप स्ट्रीम पढ़ लेंगे, तो आप फिर से स्रोत खोलने के बिना इसे फिर से पढ़ नहीं सकते। इस तरह धाराएं और इटरेटर काम करते हैं।

3

यह जेसीएफ में अपनाया जाने वाला एक सामान्य प्रवृत्ति है - इंटरफेस को कम से कम रखें, जब तक कि यह कुछ काम करने में बेहद मुश्किल न हो। यही वजह है कि आपके पास अपरिवर्तनीय संग्रह, निश्चित आकार के संग्रह जैसे अर्थशास्त्र के लिए अलग-अलग इंटरफेस नहीं हैं ..

क्यों remove(Object) प्रदान किया जाता है (वैकल्पिक के रूप में) - यह उपलब्ध नहीं करना सुरक्षित रूप से निकालना असंभव हो जाएगा संग्रह पर पुनरावृत्ति करते समय संग्रह से एक आइटम - ऐसा कुछ भी नहीं है जो reset() प्रदान करना इतना अनिवार्य है।

फिर, क्यों वहाँ एक अलग ListIterator() (previous() और previousIndex() की तरह उपलब्ध कराने के तरीकों) - एक List इंटरफेस के साथ, जबकि यह प्रयोग किया जा रहा मुख्य कार्यक्षमता लेआउट के तत्वों एक सूचकांक WRT, और करने में सक्षम हो करने की क्षमता है उन्हें इंडेक्स-ऑर्डर के साथ एक्सेस करें, चाहे निश्चित या यादृच्छिक क्रम। यह अन्य संग्रहों के मामले में नहीं है। List के लिए यह इंटरफ़ेस प्रदान नहीं करना एक सूची के साथ आसानी से काम करना असंभव नहीं होगा।

+0

ऐसी कुछ चीजें हैं जिन्हें लगभग किसी भी 'इटेटेबल' और 'इटरेटर' के साथ किया जा सकता है, जो कि इंटरफ़ेस में उपयोगी रूप से शामिल हो सकते थे लेकिन नहीं थे। उपयोगी इटरेटर विधियों में 'स्किप' शामिल होगा [लगातार एन चालान कॉल के बराबर, हालांकि कई इटरेटर इसे ओ (1)] और 'कॉपीलोकेशन' में कार्यान्वित कर सकते हैं [जो एक इटरेटर वापस लौटाएगा जो मूल के समान आइटम उत्पन्न करने की उम्मीद है ]। कोई भी इटरेटर एक 'स्किप' विधि को कार्यान्वित कर सकता है, और कोई भी गैर-विशाल परिमित इटरेटर अपने आप को एक सरणी में समझाकर 'कॉपीलोकेशन' लागू कर सकता है, और उसके बाद दोनों और प्रतिलिपि ... – supercat

+0

... उस सरणी से आइटम लौटाएं। क्लाइंट कोड या तो ऑपरेशन कर सकता है, लेकिन अगर एक इटरेटर के पास अपने आंतरिक कार्यकलापों के बारे में विशेष ज्ञान है, जिसमें क्लाइंट कोड की कमी है, तो यह इस तरह के ज्ञान का उपयोग कई क्रम-गति गति सुधार प्रदान करने के लिए कर सकता है। – supercat

2

युक्ति: अपने इटरेटर वैरिएबल को फ़ंक्शन के रूप में बनाएं, फिर आप इसे जितनी बार चाहें उतनी बार उपभोग कर सकते हैं। यह केवल तभी काम करता है जब अंतर्निहित तर्क दोहराया जा सके। स्काला में

उदाहरण

def i = (1 to 100) iterator // i is our iterator 
i.grouped(50) foreach println // prints two groups 
i.grouped(50) foreach println // prints same two groups again 
संबंधित मुद्दे