पुनरावृति और पुनरावृत्ति के बीच अंतर क्या है और उनका उपयोग कैसे करें?


196

मैं जावा में नया हूँ और मैं पुनरावृत्त और पुनरावृत्त के साथ भ्रमित हूँ। क्या कोई मुझे समझा सकता है और कुछ उदाहरण दे सकता है?

जवाबों:


201

एक Iterableतत्व उस पर दोहराया जा सकता है की एक श्रृंखला के लिए एक सरल प्रतिनिधित्व है। इसमें "वर्तमान तत्व" जैसी कोई पुनरावृत्ति स्थिति नहीं है। इसके बजाय, इसकी एक विधि है जो एक उत्पादन करती है Iterator

एक Iteratorवस्तु है जो पुनरावृति अवस्था के साथ है। यह आपको यह जांचने देता है कि क्या इसका उपयोग करने वाले अधिक तत्व हैं hasNext()और अगले तत्व (यदि कोई है) का उपयोग करना है next()

आमतौर पर, Iterableकिसी भी मान्य Iteratorएस की संख्या का उत्पादन करने में सक्षम होना चाहिए ।


क्या यह मामला है कि अगर Iterableयह interalया externalपुनरावृत्ति या उनमें से किसी के लिए संभव है?
सखुंज़ई

91

एक कार्यान्वयन वह Iterableहै जो Iteratorस्वयं को प्रदान करता है:

public interface Iterable<T>
{
    Iterator<T> iterator();
}

असाइनमेंट विशेषाधिकारों के बिना डेटा के संग्रह के माध्यम से कुछ लूप को अनुमति देने का एक सरल तरीका है (हालांकि निकालने की क्षमता के साथ)।

public interface Iterator<E>
{
    boolean hasNext();
    E next();
    void remove();
}

जावदोक को देखें ।


17

मैं विशेष रूप से ArrayList के बारे में प्रश्न का उत्तर दूंगा ताकि आप बेहतर तरीके से समझ सकें।

  1. इटरटेबल इंटरफ़ेस अपने उपवर्गों को अमूर्त पद्धति 'इटरेटर ()' को लागू करने के लिए मजबूर करता है।
public interface Iterable {
  ...
  abstract Iterator<T> iterator(); //Returns an 'Iterator'(not iterator) over elements of type T.
  ...
}
  1. Iterator इंटरफ़ेस अपने उपवर्गों को अमूर्त विधि 'hasNext ()' और 'next ()' को लागू करने के लिए मजबूर करता है।
public interface Iterator {
  ...
  abstract boolean hasNext(); //Returns true if the iteration has more elements.
  abstract E next();          //Returns the next element in the iteration.
  ...
}
  1. ArrayList लागू करता है सूची, सूची संग्रह का विस्तार करता है और संग्रह Iterable .. का विस्तार करता है, अर्थात आप इस तरह के रिश्ते को देख सकते हैं

    'Iterable <- संग्रह <- सूची <- ArrayList'

। और अनुपयोगी, संग्रह और सूची केवल अमूर्त विधि 'पुनरावृत्ति ()' की घोषणा करती है और अकेले ArrayList इसे लागू करता है।

  1. मैं अधिक विस्तृत जानकारी के लिए 'इट्रेटर ()' विधि के साथ ArrayList स्रोत कोड दिखाने जा रहा हूं।

'iterator ()' विधि 'Ir' श्रेणी की एक वस्तु लौटाती है जो 'Iterator' को लागू करती है।

public class ArrayList<E> ... implements List<E>, ...
{
  ...
  public Iterator<E> iterator() {
              return new Itr();
  }


  private class Itr implements Iterator<E> {
          ...

          public boolean hasNext() {
              return cursor != size;
          }
          @SuppressWarnings("unchecked")
          public E next() {
              checkForComodification();
              int i = cursor;
              if (i >= size)
                  throw new NoSuchElementException();
              Object[] elementData = ArrayList.this.elementData;
              if (i >= elementData.length)
                  throw new ConcurrentModificationException();
              cursor = i + 1;
              return (E) elementData[lastRet = i];
          }
          ...
  }
}
  1. कुछ अन्य विधियां या कक्षाएं Iterator (Itr) के उपयोग के माध्यम से ArrayList जैसे संग्रह के तत्वों को पुनरावृत्त करेंगी।

ये रहा एक सरल उदाहरण।

public static void main(String[] args) {

    List<String> list = new ArrayList<>();
    list.add("a");
    list.add("b");
    list.add("c");
    list.add("d");
    list.add("e");
    list.add("f");

    Iterator<String> iterator = list.iterator();
    while (iterator.hasNext()) {
        String string = iterator.next();
        System.out.println(string);
    }
}

अब, यह स्पष्ट है? :)


बहुत बढ़िया जवाब ।!
काविन्दु डोडंडुवा

मैंने इस पोस्ट को समझ लिया, लेकिन क्या होगा अगर मैं एक ऐसी विधि लिखना चाहता हूँ जिसका रिटर्न प्रकार Iterable<T>इस परिदृश्य में है तो हमें किन चरणों को लागू करने की आवश्यकता है? कृपया सुझाव दें कि उदाहरण भी दें।
प्रसन्ना सासने

12

यदि कोई संग्रह पुनरावृत्ति करने योग्य है, तो उसे पुनरावृति का उपयोग करके पुनरावृत्त किया जा सकता है (और फलस्वरूप प्रत्येक लूप के लिए उपयोग किया जा सकता है।) इट्रेटर वास्तविक वस्तु है जो संग्रह के माध्यम से पुनरावृति करेगा।


2
FYI करें java.util.Collection हमेशा java.util को लागू करता है।
पॉल ड्रेपर

2
है ना java.lang.Iterable?
ulab

यहjava.lang.Iterable
aldok

9

Iterable इंटरफ़ेस को लागू करने से किसी ऑब्जेक्ट को "foreach" स्टेटमेंट का लक्ष्य होने की अनुमति मिलती है।

class SomeClass implements Iterable<String> {}

class Main 
{
  public void method()
  {
     SomeClass someClass = new SomeClass();
     .....

    for(String s : someClass) {
     //do something
    }
  }
}

Iterator एक इंटरफ़ेस है, जिसमें तत्वों पर पुनरावृति के लिए कार्यान्वयन है। Iterable एक इंटरफ़ेस है जो Iterator प्रदान करता है।


1
यदि कोई वर्ग Iterable को कार्यान्वित कर रहा है, तो उसमें सही में Iterator () विधि होनी चाहिए ??? अगर मैं ग़लत हूं तो मेरी गलती सुझाएं।
चिन्मय बी

हाँ। इसमें इंटरफ़ेस की अनिमित विधि होनी चाहिए। इस मामले में यह Iterator है।
एजेंट.स्मिथ

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

मेरे लिए, यह सबसे अच्छा जवाब है।
सैम

मैं जानना चाहता था कि स्ट्रिंग एस के लिए प्रत्येक लूप का क्या लाभ है: someClass। चूँकि someClass जावा क्लास ऑब्जेक्ट है और स्ट्रिंग स्ट्रिंग रेफरी है। इस तरह के कार्यान्वयन के साथ किस तरह की शर्तों के तहत जाना चाहिए।
नीरज

8

सबसे महत्वपूर्ण विचार यह है कि क्या प्रश्न में आइटम को एक से अधिक बार ट्रैवर्स किया जा सकता है। ऐसा इसलिए है क्योंकि आप इट्रेटर () को फिर से कॉल करके हमेशा एक Iterable को रिवाइंड कर सकते हैं, लेकिन Iterator को रिवाइंड करने का कोई तरीका नहीं है।


मैं सोच रहा था कि क्यों संग्रह कक्षाएं सीधे Iterator इंटरफ़ेस को लागू नहीं करती हैं (Iterable को लागू करने और Iterator ऑब्जेक्ट को वापस करने के बजाय)। इस उत्तर ने यह स्पष्ट कर दिया कि - उस स्थिति में कई बार (और साथ ही साथ कई थ्रेड द्वारा) संग्रह को पार करना संभव नहीं होगा। यह बहुत महत्वपूर्ण उत्तर है।
सिंपल डेव

2

जैसा कि यहां बताया गया है , " Iterable " को foreachलूप में उपयोग करने में सक्षम होने के लिए पेश किया गया था । Iterable इंटरफ़ेस लागू करने वाला एक वर्ग इससे अधिक पुनरावृत्त हो सकता है।

Iterator वह वर्ग है जो एक Iterable पर पुनरावृत्ति का प्रबंधन करता है । यह उस स्थिति को बनाए रखता है जहां हम वर्तमान पुनरावृत्ति में हैं, और जानते हैं कि अगला तत्व क्या है और इसे कैसे प्राप्त किया जाए।


2

10 सेब वाले एक उदाहरण पर विचार करें। जब यह Iterable को लागू करता है, तो यह प्रत्येक सेब को 1 से 10 तक बक्से में डालने और एक पुनरावृत्तिकर्ता को वापस करने के लिए होता है, जिसका उपयोग नेविगेट करने के लिए किया जा सकता है।

पुनरावृति लागू करके, हम किसी भी सेब, सेब को अगले बक्से आदि में प्राप्त कर सकते हैं।

तो चलने योग्य लागू करने से इट्रेटर अपने तत्वों को नेविगेट करने के लिए देता है हालांकि नेविगेट करने के लिए, पुनरावृत्ति को लागू करने की आवश्यकता है।


1

प्रश्न: Iterable और Iterator में अंतर है?
उत्तर:

iterable: यह forEach लूप itter से संबंधित है: यह
संग्रह से संबंधित है

फॉरच लूप का लक्ष्य तत्व दोहराए जाने योग्य है।
हम संग्रह से एक-एक करके वस्तु प्राप्त करने के लिए Iterator का उपयोग कर सकते हैं

Java.avaang पैकेज में मौजूद मौजूद
java.util पैकेज में मौजूद Iterator

इसमें केवल एक विधि पुनरावृत्ति शामिल है ()
विधि पुनरावृत्ति शामिल है तीन विधि hasNext (), अगला (), निकालें () शामिल हैं


1.2 संस्करण में प्रस्तुत 1.5 संस्करण में प्रस्तुत किया गया है


1

मूल रूप से, दोनों एक-दूसरे से बहुत निकट से संबंधित हैं।

आइटरेटर पर विचार करें जो एक इंटरफ़ेस है जो हमें कुछ अपरिभाषित विधियों जैसे हैनक्स्ट (), अगले () और हटाने () की मदद से संग्रह के माध्यम से पता लगाने में मदद करता है

दूसरी तरफ, Iterable एक अन्य इंटरफ़ेस है, जिसे यदि किसी वर्ग द्वारा कार्यान्वित किया जाता है, तो वह कक्षा को Iterable होने के लिए बाध्य करता है और For-प्रत्येक निर्माण के लिए एक लक्ष्य है। इसमें इट्रेटर () नाम का केवल एक ही तरीका है जो Iterator इंटरफ़ेस से ही आता है।

जब एक संग्रह चलने योग्य होता है, तो एक पुनरावृत्त का उपयोग करके इसे पुनरावृत्त किया जा सकता है।

समझने के लिए इन पर जाएँ:

ITERABLE: http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/lang/Iterable.java

ITERATOR http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/util/Iterator.java


1

मुझे पता है कि यह एक पुराना प्रश्न है, लेकिन इसे पढ़ने वाले किसी भी व्यक्ति के लिए जो एक ही प्रश्न के साथ अटका हुआ है और जो सभी शब्दावली से अभिभूत हो सकता है, यहाँ एक अच्छा, सरल सादृश्य है जो आपको पुनरावृत्तियों और पुनरावृत्तियों के बीच इस अंतर को समझने में मदद करेगा:

एक सार्वजनिक पुस्तकालय के बारे में सोचो। पुराना स्कूल। कागज की किताबों के साथ। हां, उस तरह की लाइब्रेरी।

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

लाइब्रेरियन पुनरावृत्त की तरह होगा। वह किसी भी समय किसी विशिष्ट पुस्तक को इंगित कर सकता है। वह उस स्थान पर पुस्तक को सम्मिलित / हटा / संशोधित / संशोधित कर सकता है जहाँ वह इंगित कर रहा है। वह कहते हैं, क्रम में, हर किताब में हर बार जब आप चिल्लाते हैं "अगला!" उसे। तो, आप सामान्य रूप से उससे पूछेंगे: "अगला है?", और वह "हाँ" कहेगा, जिसे आप "अगला" कहते हैं। और वह अगली पुस्तक की ओर इशारा करेगा। वह यह भी जानता है कि कब वह शेल्फ के अंत तक पहुँच गया है, ताकि जब आप पूछें: "अगला है?" वह कहेगा "नहीं"।

मुझे पता है कि यह थोड़ा मूर्खतापूर्ण है, लेकिन मुझे उम्मीद है कि इससे मदद मिलेगी।


0

कॉलिनड और सीकर जवाब के अलावा ।

सरल शब्दों में, Iterable और Iterator जावा के संग्रह ढांचे में प्रदान किए गए दोनों इंटरफेस हैं।

iterable

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

iterableElements.forEach (x -> System.out.println(x) );

इटरेटर

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

for (Iterator i = c.iterator(); i.hasNext(); ) {
       Element e = i.next();    //Get the element
       System.out.println(e);    //access or modify the element
}

सूत्रों का कहना है:

  1. जावा डॉक्टर Iterable
  2. जावा डॉक्टर Iterator

0

Iterable जावा में प्रत्येक लूप के लिए उपयोग करने के लिए पेश किया गया था

public interface Collection<E> extends Iterable<E>  

Iteratorवह वर्ग है जो एक से अधिक पुनरावृति का प्रबंधन करता है Iterable। यह उस स्थिति को बनाए रखता है जहां हम वर्तमान पुनरावृत्ति में हैं, और जानते हैं कि अगला तत्व क्या है और इसे कैसे प्राप्त किया जाए।


एसओ में आपका स्वागत है, आप हमेशा यहां का दौरा कर सकते हैं , ताकि आपका उत्तर अधिक उपयोगी और साफ हो। हमारे मामले में सवाल दो वर्गों के संबंध में एक स्पष्टीकरण के लिए पूछ रहा है, लेकिन आपका जवाब चीजों को साफ करने के बजाय काफी भ्रामक है। अपने उत्तर को और अधिक ठोस बनाने के लिए, ज्ञात / मान्य / प्रमाणित स्रोतों से स्निपेट पोस्ट करते समय एक रेफरी रखने की कोशिश करें।
अंताजदेव
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.