क्यों? और इटरेटर आइटम पॉइंटर को पहली स्थिति में स्थानांतरित करने का सबसे अच्छा तरीका क्या है?क्यों Iterator के पास कोई रीसेट विधि नहीं है?
उत्तर
क्यों?
क्योंकि अगर आप एक रीसेट विधि हर इटरेटर एक रीसेट विधि होना आवश्यक है के लिए इटरेटर बाध्य करते हैं। यह हर पुनरावर्तक लेखक अतिरिक्त काम देता है। इसके अलावा कुछ इटरेटर रीसेट करने के लिए वास्तव में कठिन (या वास्तव में महंगा) हैं, और आप नहीं चाहते हैं कि उपयोगकर्ता उन पर रीसेट करें। फाइलों या धाराओं पर इटरेटर अच्छे उदाहरण हैं।
इटेटरेटर आइटम पॉइंटर को पहली स्थिति में स्थानांतरित करने का सबसे अच्छा तरीका क्या है?
नया इटरेटर बनाएं। रीसेट की तुलना में यह शायद ही कभी महंगा है।
सबसे अच्छा तरीका एक नया निर्माण करना है!
ठीक उसी तरह से आप पिछले एक बनाया (जावा समान है, लेकिन मैं एक जावा आरईपीएल आसान नहीं है): = iteratable.iterator इटरेटर
एक बार जब आप स्ट्रीम पढ़ लेंगे, तो आप फिर से स्रोत खोलने के बिना इसे फिर से पढ़ नहीं सकते। इस तरह धाराएं और इटरेटर काम करते हैं।
यह जेसीएफ में अपनाया जाने वाला एक सामान्य प्रवृत्ति है - इंटरफेस को कम से कम रखें, जब तक कि यह कुछ काम करने में बेहद मुश्किल न हो। यही वजह है कि आपके पास अपरिवर्तनीय संग्रह, निश्चित आकार के संग्रह जैसे अर्थशास्त्र के लिए अलग-अलग इंटरफेस नहीं हैं ..
क्यों remove(Object)
प्रदान किया जाता है (वैकल्पिक के रूप में) - यह उपलब्ध नहीं करना सुरक्षित रूप से निकालना असंभव हो जाएगा संग्रह पर पुनरावृत्ति करते समय संग्रह से एक आइटम - ऐसा कुछ भी नहीं है जो reset()
प्रदान करना इतना अनिवार्य है।
फिर, क्यों वहाँ एक अलग ListIterator()
(previous()
और previousIndex()
की तरह उपलब्ध कराने के तरीकों) - एक List
इंटरफेस के साथ, जबकि यह प्रयोग किया जा रहा मुख्य कार्यक्षमता लेआउट के तत्वों एक सूचकांक WRT, और करने में सक्षम हो करने की क्षमता है उन्हें इंडेक्स-ऑर्डर के साथ एक्सेस करें, चाहे निश्चित या यादृच्छिक क्रम। यह अन्य संग्रहों के मामले में नहीं है। List
के लिए यह इंटरफ़ेस प्रदान नहीं करना एक सूची के साथ आसानी से काम करना असंभव नहीं होगा।
ऐसी कुछ चीजें हैं जिन्हें लगभग किसी भी 'इटेटेबल' और 'इटरेटर' के साथ किया जा सकता है, जो कि इंटरफ़ेस में उपयोगी रूप से शामिल हो सकते थे लेकिन नहीं थे। उपयोगी इटरेटर विधियों में 'स्किप' शामिल होगा [लगातार एन चालान कॉल के बराबर, हालांकि कई इटरेटर इसे ओ (1)] और 'कॉपीलोकेशन' में कार्यान्वित कर सकते हैं [जो एक इटरेटर वापस लौटाएगा जो मूल के समान आइटम उत्पन्न करने की उम्मीद है ]। कोई भी इटरेटर एक 'स्किप' विधि को कार्यान्वित कर सकता है, और कोई भी गैर-विशाल परिमित इटरेटर अपने आप को एक सरणी में समझाकर 'कॉपीलोकेशन' लागू कर सकता है, और उसके बाद दोनों और प्रतिलिपि ... – supercat
... उस सरणी से आइटम लौटाएं। क्लाइंट कोड या तो ऑपरेशन कर सकता है, लेकिन अगर एक इटरेटर के पास अपने आंतरिक कार्यकलापों के बारे में विशेष ज्ञान है, जिसमें क्लाइंट कोड की कमी है, तो यह इस तरह के ज्ञान का उपयोग कई क्रम-गति गति सुधार प्रदान करने के लिए कर सकता है। – supercat
युक्ति: अपने इटरेटर वैरिएबल को फ़ंक्शन के रूप में बनाएं, फिर आप इसे जितनी बार चाहें उतनी बार उपभोग कर सकते हैं। यह केवल तभी काम करता है जब अंतर्निहित तर्क दोहराया जा सके। स्काला में
उदाहरण
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
- 1. क्यों यूयूआई रीसेट सीएसएस प्रमाणीकरण पास नहीं करता है?
- 2. क्यों कोई सेवा.ऑनटॉप विधि नहीं?
- 3. क्यों उत्पादइटर वापसी प्रकार Iterator [कोई]?
- 4. स्ट्रिंगबिल्डर के पास इंडेक्सऑफ विधि क्यों नहीं है?
- 5. कोई Convert.toFloat() विधि क्यों नहीं है?
- 6. PHP के पास कोई डिफ़ॉल्ट कन्स्ट्रक्टर क्यों नहीं है?
- 7. इंटरफ़ेस सदस्यों के पास कोई एक्सेस संशोधक क्यों नहीं है?
- 8. पैरामीटर के बिना कोई IsNullOrEmpty अधिभार विधि क्यों नहीं है?
- 9. स्कैला के समांतर अनुक्रमों में कोई विधि क्यों नहीं है?
- 10. बिगइंटर के पास कोई सीमा नहीं है?
- 11. एक विधि क्यों नहीं है?
- 12. पायथन: क्यों सूचीबद्ध सूची में कोई विधि नहीं है?
- 13. सी ++ std :: वेक्टर में कोई pop_front विधि क्यों नहीं है?
- 14. सी # में कोई रिवर्सएन्यूमेरेटर क्यों नहीं है?
- 15. ++ iterator और iterator ++ के बीच प्रदर्शन अंतर?
- 16. सी ++ iterator?
- 17. मेरे पास स्क्रॉल बार क्यों नहीं है?
- 18. एसटीएल में कोई "इटेबल" इंटरफ़ेस क्यों नहीं है?
- 19. ग्रोवी - Iterator
- 20. स्कैला सूचियों के पास ऑर्डरिंग क्यों नहीं है?
- 21. .NET के पास बिडरेक्शनल एन्युमरेटर क्यों नहीं है?
- 22. रुबी के पास थ्रेडपूल अंतर्निहित क्यों नहीं है?
- 23. TaskFactory.StartNew विधि सामान्य क्यों नहीं है?
- 24. स्कैला Iterator
- 25. XElement में GetAttributeValue विधि क्यों नहीं है?
- 26. Throwable.fillInStackTrace() विधि सार्वजनिक क्यों है? कोई इसका इस्तेमाल क्यों करेगा?
- 27. रनटाइम पर एक मौजूदा कक्षा में कोई विधि जोड़ना संभव है? क्यों या क्यों नहीं?
- 28. HttpWebRequest की कोई करीबी विधि नहीं है?
- 29. क्यों ObservableCollection में RemoveAll विधि नहीं है?
- 30. एक विधि किसके पास है?
(इस तथ्य को छोड़कर कि 'निकालें' विधि है, जो * वास्तव में वास्तव में सभी इटरेटर "अतिरिक्त काम" नहीं देती है, क्योंकि ऑपरेशन वैकल्पिक है।) – aioobe
@aioobe कुछ ऐसे मामले हैं जहां वर्तमान ऑब्जेक्ट को हटाया जा रहा है इटरेटर डेवलपर्स के लिए जीवन वास्तव में आसान बनाता है। बहुत कम मामले हैं जहां यह रीसेट के लिए सच है (क्योंकि आप लगभग हमेशा एक नया इटरेटर बना सकते हैं)। – DJClayworth
@ डीजेक्लेवर्थ "यह हर पुनरावर्तक लेखक अतिरिक्त काम देता है।" यह एक उचित प्रतिक्रिया नहीं है। लाइब्रेरी कार्यान्वयन करने वालों को थोड़ा अतिरिक्त प्रयास करने की आवश्यकता है, लेकिन भुगतान यह है कि कई लाइब्रेरी उपयोगकर्ताओं को लाभ मिलेगा। – stackoverflowuser2010