2008-10-22 18 views

उत्तर

8

में हैं:

बाहरी बनाम आंतरिक iterators।

बाहरी इटरेटर - जब पुनरावृत्ति संग्रह वस्तु द्वारा नियंत्रित किया जाता है तो हम कहते हैं कि हमारे पास बाहरी इटरेटर है।

.net या जावा जैसी भाषाओं में बाहरी iterators बनाने के लिए बहुत आसान है। हमारे शास्त्रीय कार्यान्वयन में एक बाहरी इटरेटर लागू किया जाता है। निम्न उदाहरण में एक बाहरी इटरेटर प्रयोग किया जाता है:

// using iterators for a clloection of String objects: 
// using in a for loop 
for (Iterator it = options.iterator(); it.hasNext();) { 
    String name = (String)it.next(); 
    System.out.println(name); 
} 

// using in while loop 
Iterator name = options.iterator(); 
    while (name.hasNext()){ 
     System.out.println(name.next()); 
    } 

// using in a for-each loop (syntax available from java 1.5 and above) 
    for (Object item : options) 
     System.out.println(((String)item)); 

आंतरिक Iterators - इटरेटर यह नियंत्रित करता है जब हम एक आंतरिक इटरेटर

दूसरी तरफ है को लागू करने और आंतरिक iterators का उपयोग कर वास्तव में मुश्किल है। जब एक आंतरिक इटरेटर का उपयोग किया जाता है तो इसका मतलब है कि कोड चलाया जा सकता है कुल वस्तु को सौंपा गया है। भाषाओं कि के लिए की पेशकश समर्थन में उदाहरण के लिए यह आंतरिक iterators कॉल करने के लिए आसान है:

collection do: [:each | each doSomething] (Smalltalk) 

मुख्य विचार कोड संग्रह करने के लिए निष्पादित करने के लिए पारित करने के लिए है। फिर संग्रह आंतरिक रूप से प्रत्येक घटक पर कुछ करने की विधि को कॉल करेगा। C++ में doMethod विधि को पॉइंटर के रूप में भेजना संभव है। सी #, .NET या VB.NET में विधि को प्रतिनिधि के रूप में भेजना संभव है। जावा में Functor डिज़ाइन पैटर्न का उपयोग किया जाना चाहिए। मुख्य विचार केवल एक विधि (कुछ करना) के साथ आधार इंटरफ़ेस बनाना है। फिर विधि को एक कक्षा में कार्यान्वित किया जाएगा जो इंटरफ़ेस लागू करता है और कक्षा को पुन: संग्रहित करने के लिए संग्रह में पारित किया जाएगा। अधिक जानकारी के लिए Functor डिज़ाइन पैटर्न देखें।

17

बाहरी इटरेटर

जब आप एक इटरेटर और इस पर कदम मिलता है, कि एक बाहरी इटरेटर

for (Iterator iter = var.iterator(); iter.hasNext();) { 
    Object obj = iter.next(); 
    // Operate on obj 
} 

आंतरिक इटरेटर

है जब आप अधिक चलाने के लिए एक विधि के लिए एक समारोह वस्तु पारित एक सूची, जो एक आंतरिक इटरेटर

var.each(new Functor() { 
    public void operate(Object arg) { 
    arg *= 2; 
    } 
}); 
+1

चूंकि जावा 5 का उपयोग करने के लिए पसंदीदा तरीका एक बाहरी इटरेटर, प्रत्येक लूप के लिए उपयोग करना होगा: * (ऑब्जेक्ट ओ: var) {// NOOP} * के लिए हालांकि यह संस्करण का उपयोग कर स्पष्ट इटरेटर के लिए केवल वाक्य रचनात्मक चीनी है। – Alex

+1

@ जोहानजचार्य फॉरेच लूप को आंतरिक इटरेटर के रूप में नहीं माना जाता है, क्योंकि हमारे पास इटरेटर पर नियंत्रण नहीं है? – denis631

+1

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

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