2012-12-21 6 views
6

मेरा मानना ​​है कि मैंने देखा है कि कुछ Iterables (जैसे IterableString class) के लिए या तो एक नया इटरेटर बनाया गया है या इटेटरेटर किसी भी तरह से हर नए फोरच निर्माण के साथ शुरुआत में रीसेट करता है लेकिन वह यह अन्य Iterables के साथ हो लिए ...जावा इटेरबल्स "रीसेटिंग" इटरेटर प्रत्येक फोरैच का निर्माण

उदाहरण के लिए प्रतीत नहीं होता है, तो आपको निम्न कोड चलाते हैं:


*** 
O 
N 
C 
E 
*** 
*** 
T 
W 
I 
C 
E 
*** 
T 
W 
I 
C 
E 

:


import java.util.ArrayList; 


public class test { 


    public static void main(String args[]) { 
    IterableString x = new IterableString("ONCE"); 

    System.out.println("***"); 
    for (char ch : x){ 
     System.out.println(ch); 
    } 

    System.out.println("***"); 
    for (char ch : x){ 
     System.out.println(ch); 
    } 

    ArrayList y = new ArrayList(); 
    y.add('T'); 
    y.add('W'); 
    y.add('I'); 
    y.add('C'); 
    y.add('E'); 

    System.out.println("***"); 
    for (char ch : y){ 
     System.out.println(ch); 
    } 

    System.out.println("***"); 
    for (char ch : y){ 
     System.out.println(ch); 
    } 

    System.out.println(); 
    } 
} 

आप निम्नलिखित उत्पादन देखेंगे

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

अधिक ठोस रूप से, हम एररलिस्ट जैसे काम करने के लिए IterableString जैसे वर्ग को वास्तव में कैसे संशोधित करेंगे?

+2

क्या बिल्ली 'है IterableString' ?? अज्ञात ऑब्जेक्ट के पास इटरेटर कॉन्फ़िगर किए जाने के तरीके के साथ कुछ करने के लिए हो सकता है ... – mre

+3

'Iterable' के लिए जावाडोक यह कहने के लिए बहुत कुछ नहीं लगता है कि प्रत्येक कॉल 'इटेटर()' को एक नया' Iterator 'देता है - लेकिन यह जेडीके (और समझदार) द्वारा स्वीकार्य अभ्यास प्रतीत होता है। तो यह कभी भी "बग" जैसा दिखता है जिसने कभी 'IterableString' बनाया है। –

उत्तर

4

कक्षा IterableString (जैसा कि आपके linked article द्वारा परिभाषित किया गया है) Iterable और Iterator दोनों है। चाहे या नहीं कि एक अच्छा विचार बहस का मुद्दा है है - लेकिन उन्हें आसानी से ठीक है:

// This method implements Iterable. 
    public Iterator<Character> iterator() { 
    return new IterableString(this.str); 
    } 
+0

धन्यवाद! मुझे इसी तरह के मुद्दों से फेंक दिया गया था जिसे मैंने अन्य पुनरावृत्तियों के साथ देखा है (जैसे [यह एक] (http://code.hammerpig.com/how-to-read-really-large-files-in-java.html) जहां नेस्टेड इटरेटर वर्ग के पास एक और मुद्दा था जिसके साथ इस तथ्य के लिए जिम्मेदार होना जरूरी था कि यह अपने बाहरी वर्ग में घटकों को बदलने के बारे में जागरूक था)। किसी कारण से त्रुटि की प्रतीत होने वाली स्थिरता ने मुझे यह इंप्रेशन दिया कि अरेलेलिस्ट जैसे पुनरावृत्तियों के साथ कुछ विशेष चल रहा था, जो गैर-मानक पुनरावृत्तियों में टूटे हुए टुकड़ों के विपरीत था। – user1920345

-1

एक ArrayList जावा फोरैच लूप में फिर से चालू किया जा सकता है क्योंकि यह जावा में Iterable इंटरफ़ेस लागू करता है। Iterable इंटरफ़ेस एक विधि iterator की रूपरेखा तैयार करता है जो संग्रह के लिए एक पुनरावर्तक देता है। जावा में एक फोरैच लूप का उपयोग हुड के तहत इस विधि से इटरेटर का उपयोग करता है। हर बार जब आप एक नया फोरच लूप बनाते हैं, तो ArrayList एक नया इटरेटर प्रदान कर रहा है।

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

+1

यह अभी भी ओपीएस प्रश्न –

+0

को संबोधित नहीं करता है, मैं आपकी टिप्पणी @ कोड-गुरु द्वारा थोड़ा उलझन में हूं। शायद मैं इस सवाल को गलत समझ रहा हूं लेकिन मैंने रेखांकित किया है कि एक ऐरेलिस्ट के पास फ़ोरैच लूप में उस व्यवहार का व्यवहार क्यों है और उपयोगकर्ता द्वारा परिभाषित कक्षा में नकल करने का तरीका कैसा है। – user1897691

+0

सवाल यह है कि 'IterableString' वर्ग' ArrayList' से भिन्न व्यवहार क्यों करता है। –

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