"हाय, अमीगो!"

"हाय, ऐली!"

"आज मैं आपको पुनरावृत्तियों के बारे में बताना चाहता हूं।"

"पुनरावृत्तियों का संग्रह के रूप में एक ही समय में व्यावहारिक रूप से आविष्कार किया गया था। संग्रह का मुख्य उद्देश्य तत्वों को संग्रहीत करना है, और एक पुनरावर्तक का मुख्य उद्देश्य इन तत्वों को एक-एक करके पुनर्प्राप्त करना है।"

"तत्वों का एक सेट प्राप्त करने में क्या मुश्किल है?"

"सबसे पहले, कुछ संग्रहों में तत्व, जैसे कि सेट, के पास एक स्थापित क्रम नहीं है और/या क्रम लगातार बदलता रहता है।"

"दूसरा, कुछ डेटा संरचनाएं वस्तुओं को बहुत ही जटिल तरीके से संग्रहीत कर सकती हैं: विभिन्न समूहों, सूचियों आदि में। दूसरे शब्दों में, सभी तत्वों को क्रम में सौंपना एक गैर-तुच्छ कार्य होगा।"

"तीसरा, संग्रह बदलने की प्रवृत्ति रखते हैं। मान लीजिए कि आप एक संग्रह की संपूर्ण सामग्री को प्रदर्शित करने का निर्णय लेते हैं, लेकिन आउटपुट के ठीक बीच में JVM दूसरे थ्रेड पर स्विच करता है जो संग्रह के आधे तत्वों को बदल देता है। इसलिए आउटपुट के बजाय, आपको मिलता है कौन क्या जानता है।"

"हम्म..."

"लेकिन! ये ठीक उसी तरह की समस्याएं हैं जो एक पुनरावर्तक हल कर सकता है। एक संग्रह के भीतर एक पुनरावर्तक एक विशेष वस्तु है, जिसके पास एक ओर, अपने सभी निजी डेटा तक पहुंच होती है और इसकी आंतरिक संरचना को जानता है, और दूसरी ओर , सार्वजनिक Iterator इंटरफ़ेस लागू करता है, जो सभी को यह जानने देता है कि इसके साथ कैसे काम करना है। "

"कुछ पुनरावृत्तियों में एक आंतरिक सरणी होती है जिसमें संग्रह के सभी तत्वों की नकल की जाती है जब पुनरावर्तक बनाया जाता है। यह सुनिश्चित करता है कि संग्रह में कोई भी परिवर्तन तत्वों की संख्या या क्रम को प्रभावित नहीं करेगा।"

"मुझे लगता है कि आप प्रत्येक के साथ काम करते समय इस पर आ गए हैं । आप एक संग्रह पर एक साथ लूप नहीं कर सकते हैं और तत्वों को हटा सकते हैं। यह ठीक उसी तरह से है जिस तरह से एक पुनरावर्तक काम करता है।"

"संगामिति पुस्तकालय में जोड़े गए नए संग्रह में, इस समस्या को खत्म करने के लिए पुनरावर्तक को फिर से काम किया जाता है।"

"मैं आपको याद दिलाता हूं कि इटरेटर कैसे काम करता है।"

"Java में एक विशेष Iterator इंटरफ़ेस है। यहाँ इसकी विधियाँ हैं:"

Iterator<E> इंटरफ़ेस के तरीके विवरण
boolean hasNext() जांचें कि क्या कोई और तत्व हैं
E next() वर्तमान तत्व लौटाता है और अगले पर जाता है।
void remove() वर्तमान तत्व को हटाता है

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

"   अगली () विधि संग्रह में अगला तत्व लौटाती है।"

" हैसनेक्स्ट () विधि का उपयोग यह जांचने के लिए किया जाता है कि क्या कोई और तत्व हैं।"

"और हटाएं () वर्तमान तत्व को हटा दें।"

"कोई प्रश्न?"

"तरीकों के ऐसे अजीब नाम क्यों हैं? क्यों नहीं isEmpty() और getNextElement()?"

"क्या यह अधिक समझ में नहीं आएगा?"

"यह अधिक समझ में आता है, लेकिन नाम सी ++ भाषा से आए हैं, जहां इटरेटर पहले दिखाई देते थे।"

"अच्छा। चलो जारी रखते हैं।"

"एक इटरेटर के अतिरिक्त, इटेरेबल इंटरफ़ेस भी है, जिसे इटरेटर्स का समर्थन करने वाले सभी संग्रहों द्वारा कार्यान्वित किया जाना चाहिए। इसकी एक ही विधि है:"

Iterable<T> इंटरफ़ेस के तरीके विवरण
Iterator<T>iterator() एक पुनरावर्तक वस्तु लौटाता है

"आप इस विधि का उपयोग किसी भी संग्रह पर इसके तत्वों के माध्यम से चलने के लिए एक पुनरावर्तक वस्तु प्राप्त करने के लिए कर सकते हैं। आइए ट्रीसेट के सभी तत्वों पर चलते हैं : "

उदाहरण
TreeSet<String> set = new TreeSet<String>();
Iterator<String> iterator = set.iterator();

while (iterator.hasNext())
{
 String item = iterator.next();
 System.out.println(item);
}

"इस तरह एक पुनरावर्तक का उपयोग करना बहुत सुविधाजनक नहीं है - बहुत अधिक अनावश्यक और स्पष्ट कोड है। जावा में for-प्रत्येक लूप दिखाई देने पर स्थिति सरल हो गई। "

"अब यह कोड बहुत अधिक कॉम्पैक्ट और पठनीय है:"

पहले बाद
TreeSet<String> set = new TreeSet<String>();
Iterator<String> iterator = set.iterator();

while (iterator.hasNext())
{
 String item = iterator.next();
 System.out.println(item);
}
TreeSet<String> set = new TreeSet<String>();

for(String item : set)
{
 System.out.println(item);
}

"यह एक ही कोड है! इटरेटर दोनों मामलों में प्रयोग किया जाता है।"

"यह सिर्फ इतना है कि इसका उपयोग प्रत्येक लूप के लिए छिपा हुआ है। ध्यान दें कि दाईं ओर के कोड में कोई लाल पाठ नहीं है। इटरेटर का उपयोग पूरी तरह छुपा हुआ है।"

" प्रत्येक लूप के लिए किसी भी वस्तु का उपयोग किया जाता है जो पुनरावृत्तियों का समर्थन करता है। दूसरे शब्दों में, आप अपनी खुद की कक्षा लिख ​​सकते हैं, इसमें पुनरावर्तक () विधि जोड़ सकते हैं, और प्रत्येक वस्तु के लिए इसकी वस्तुओं का उपयोग कर सकते हैं।"

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

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

"उनके कार्यान्वयन के बावजूद, सूचियां तत्वों के क्रम को बनाए रखती हैं, जो उनके साथ एक पुनरावर्तक के माध्यम से थोड़ी अधिक आसानी से काम करती हैं।"

"यहाँ ListIterator <E> इंटरफ़ेस के तरीके हैं :"

तरीका विवरण
boolean hasNext() जाँचता है कि आगे कोई और तत्व हैं या नहीं।
E next() अगला तत्व लौटाता है।
int nextIndex() अगले तत्व का सूचकांक लौटाता है
void set(E e) वर्तमान तत्व का मान बदलता है
boolean hasPrevious() जाँचता है कि क्या पीछे कोई तत्व है।
E previous() पिछला तत्व लौटाता है
int previousIndex() पिछले तत्व का सूचकांक लौटाता है
void remove() वर्तमान तत्व को हटाता है
void add(E e) सूची के अंत में एक तत्व जोड़ता है।

"दूसरे शब्दों में, यहां हम आगे और पीछे दोनों तरफ जा सकते हैं। और कुछ अन्य छोटी विशेषताएं हैं।"

"ठीक है, यह दिलचस्प सामान है। इसका उपयोग कहाँ किया जाता है?"

"मान लीजिए कि आप एक लिंक की गई सूची पर आगे और पीछे जाना चाहते हैं। गेट ऑपरेशन धीमा होगा, लेकिन अगला () ऑपरेशन बहुत तेज होगा।"

"हम्म। तुमने मुझे विश्वास दिलाया। मैं इसे ध्यान में रखूंगा।"

"धन्यवाद, ऐली!"