Yineleyici ve yinelenebilir arasındaki fark nedir ve nasıl kullanılır?


197

Java'da yeniyim ve yineleyici ve yinelenebilir ile gerçekten kafam karıştı. Birisi bana açıklayabilir ve bazı örnekler verebilir mi?

Yanıtlar:


201

An Iterable, tekrarlanabilen bir dizi öğenin basit bir temsilidir. "Geçerli öğe" gibi bir yineleme durumu yoktur. Bunun yerine, bir Iterator.

An Iterator, yineleme durumuna sahip nesnedir. Kullanarak daha fazla öğe olup olmadığını kontrol etmenizi hasNext()ve kullanarak bir sonraki öğeye (varsa) gitmenizi sağlar next().

Tipik olarak, a Iterableherhangi bir sayıda geçerli Iterators üretebilmelidir .


maddenin eğer Iterablevardır interalya externalyineleyici ya mümkündür bunlardan herhangi var mı?
sakhunzai

91

Uygulaması, Iterableaşağıdakileri sağlayan bir uygulamadır Iterator:

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

Yineleyici, bazılarının atama ayrıcalıkları olmadan bir veri toplama döngüsüne girmesine izin vermenin basit bir yoludur (kaldırma yeteneğine sahip olsa da).

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

Bakınız Javadoc .


17

Daha iyi anlamanıza yardımcı olmak için özellikle ArrayList ile ilgili soruyu örnek olarak cevaplayacağım.

  1. Yinelenebilir arabirim alt sınıflarını soyut yöntem 'iterator ()' uygulamaya zorlar.
public interface Iterable {
  ...
  abstract Iterator<T> iterator(); //Returns an 'Iterator'(not iterator) over elements of type T.
  ...
}
  1. Yineleyici arabirimi alt sınıflarını 'hasNext ()' ve 'next ()' soyut yöntemini uygulamaya zorlar.
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 List uygular, List genişletir Koleksiyon ve Koleksiyon yinelenebilir genişletir .. Yani, ilişki gibi görebilirsiniz

    'Tekrarlanabilir <- Koleksiyon <- Liste <- ArrayList'

. Yinelenebilir, Koleksiyon ve Liste sadece 'iterator ()' soyut yöntemini beyan eder ve ArrayList tek başına bunu uygular.

  1. Daha ayrıntılı bilgi için 'iterator ()' yöntemi ile ArrayList kaynak kodunu göstereceğim.

'iterator ()' yöntemi, 'Yineleyici' uygulayan 'Itr' sınıfı bir nesne döndürür.

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. Diğer bazı yöntemler veya sınıflar, Yineleyici (Itr) kullanarak ArrayList gibi koleksiyon öğelerini yineleyecektir.

İşte basit bir örnek.

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);
    }
}

Şimdi açık mı? :)


Mükemmel cevap .!
Kavindu Dodanduwa

Bu yazıyı anladım, ancak geri dönüş türü Iterable<T>bu senaryoda olan bir yöntem yazmak istersem ne adımları uygulamalıyız? Lütfen bu örneği de önerin.
Prasanna Sasne

12

Bir koleksiyon yinelenebilirse, bir yineleyici kullanılarak yinelenebilir (ve sonuç olarak her döngü için bir kullanılabilir.) Yineleyici, koleksiyon boyunca yinelenecek gerçek nesnedir.


2
Bir java.util.Collection her zaman java.util uygular.
Paul Draper

2
Öyle değil java.lang.Iterablemi?
ulab

It'sjava.lang.Iterable
aldok

9

Yinelenebilir arabirimin uygulanması, bir nesnenin "foreach" ifadesinin hedefi olmasını sağlar.

class SomeClass implements Iterable<String> {}

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

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

Yineleyici, öğeler üzerinde yineleme için uygulamaya sahip bir arabirimdir. Yinelenebilir, Yineleyici sağlayan bir arabirimdir.


1
Herhangi bir sınıf Yinelenebilir uyguluyorsa doğru bir Iterator () yöntemi olmalıdır ??? Eğer Yanlışsam beni düzelt.
Chinmaya B

Evet. Arabirimin uygulanmayan yöntemi olmalıdır. Bu durumda yineleyici.
agent.smith

Akıllı bir cevap için teşekkürler. Buraya Iterable vs Iterator anlayışımı tekrar kontrol etmek için geldim. Onayladın. Diğer tüm cevaplar yapı hakkında konuşur, sanırım iyi, ama neden birini diğerinin üzerinde kullanacağım sorusuna cevap vermiyor.
EricGreg

Benim için en iyi cevap bu.
Sam

Ne faydası olduğunu bilmek istedim String s: someClass için her döngü için. SomeClass java sınıfı nesnesi ve s String ref olduğundan. Hangi koşullar altında bu tür uygulamalarla gitmek gerekir.
Neeraj

8

En önemli husus, söz konusu ürünün bir kereden fazla sürülüp sürülemeyeceğidir. Bunun nedeni, yineleyiciyi () tekrar çağırarak her zaman bir Yinelemeyi geri alabilmenizdir, ancak bir Yineleyiciyi geri sarmanın bir yolu yoktur.


Koleksiyon sınıflarının neden Iterator arabirimini (Iterable ve dönen Iterator nesnesini uygulamak yerine) doğrudan uygulamadığını merak ediyordum. Bu cevap, bu durumda koleksiyonu birden çok kez (ve aynı anda birden çok iş parçacığıyla) geçmenin mümkün olmayacağını açıkça ortaya koydu. Bu çok önemli bir cevap.
SimpleDev

2

As açıkladı Burada , “ iterable ” in kullanabilmek tanıtıldı foreachdöngü. Uygulayan A sınıfı iterable arayüzü iterated edilebilir.

Yineleyici, yinelenebilir bir yineleme üzerinden yinelemeyi yöneten bir sınıftır . Mevcut yinelemede nerede olduğumuzu korur ve bir sonraki öğenin ne olduğunu ve nasıl elde edileceğini bilir.


2

10 elma içeren bir örneği ele alalım. Yinelenebilir uygulandığında, her elmayı 1'den 10'a kadar olan kutulara koymak ve gezinmek için kullanılabilecek bir yineleyici döndürmek gibidir.

Yineleyici uygulayarak, sonraki kutularda herhangi bir elma, elma alabiliriz.

Bu nedenle, yinelenebilir uygulamanın, gezinmesine rağmen öğelerinde gezinmesi için bir yineleyici verir, yineleyicinin uygulanması gerekir.


1

Soru: Yinelenebilir ve Yineleyici arasındaki fark nedir?
Ans:

iterable: forEach loop
iterator ile ilgilidir: Koleksiyon ile ilgilidir

ForEach döngüsünün hedef elemanı tekrarlanabilir olmalıdır.
Nesneyi Koleksiyondan tek tek almak için Iterator'ı kullanabiliriz

Java.ḷang paketinde yinelenebilir
hediye Java.util paketinde yinelenebilir hediye

Yalnızca bir yöntem yineleyici () içerir
Üç yöntem içerir hasNext (), next (), remove ()

1.5 sürümünde
tanıtıldı 1.2 sürümünde tanıtıldı


1

Temel olarak, her ikisi de birbiriyle çok yakından ilişkilidir.

Iterator'ı , hasNext (), next () ve remove () gibi tanımlanmamış yöntemlerin yardımıyla bir koleksiyonda geçiş yapmamıza yardımcı olan bir arayüz olarak düşünün

Diğer tarafta, Yinelenebilir başka bir arabirimdir, bir sınıf tarafından uygulandığında sınıfı Yinelenebilir olmaya zorlar ve For-Each yapısı için bir hedeftir. Yineleyici arabiriminin kendisinden gelen iterator () adında tek bir yöntemi vardır.

Bir koleksiyon tekrarlanabilir olduğunda, bir yineleyici kullanılarak yinelenebilir.

Anlamak için bunları ziyaret edin:

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

Bunun eski bir soru olduğunu biliyorum, ama bunu okuyan herkes için aynı soruya sıkışmış ve tüm terminolojiye boğulmuş olabilecek herkes için, tekrarlanabilirler ve yineleyiciler arasındaki bu ayrımı anlamanıza yardımcı olacak iyi ve basit bir benzetme:

Bir halk kütüphanesi düşünün. Eski okul. Kağıt kitaplarla. Evet, bu tür bir kütüphane.

Kitaplarla dolu bir raf yinelenebilir gibi olurdu. Raftaki uzun kitap dizisini görebilirsiniz. Kaç tane olduğunu bilmiyor olabilirsiniz, ancak bunun uzun bir kitap koleksiyonu olduğunu görebilirsiniz.

Kütüphaneci yineleyici gibi olurdu. Herhangi bir zamanda belirli bir kitaba işaret edebilir. Kitabı işaret ettiği yere ekleyebilir / çıkarabilir / değiştirebilir / okuyabilir. Her seferinde "sonraki!" ona. Yani, ona normalde “İleri mi var?” Diye sorarsınız ve “evet” diyecektir. ve bir sonraki kitaba işaret edecek. Rafın ne zaman ulaştığını da biliyor, böylece "İleri mi?" "hayır" der.

Biraz aptalca biliyorum, ama umarım bu yardımcı olur.


0

ColinD ve Seeker yanı sıra cevaplar.

Basit bir ifadeyle, Yinelenebilir ve Yineleyici , Java'nın Koleksiyon Çerçevesinde sağlanan arabirimlerdir.

iterable

Bir sınıf, koleksiyonunu yinelemek için her biri için bir döngüye sahip olmak istiyorsa, Yinelenebilir arabirimi uygulamak zorundadır . Bununla birlikte, for-each döngüsü yalnızca koleksiyon boyunca ileri yönde dolaşmak için kullanılabilir ve bu koleksiyondaki öğeleri değiştiremezsiniz . Ancak, tüm istediğiniz öğe verilerini okumaksa, o zaman çok basittir ve Java lambda ifadesi sayesinde genellikle bir astardır. Örneğin:

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

yineleyici

Bu arayüz, bir koleksiyon üzerinden öğelerini elde etmenizi ve çıkarmanızı sağlar. Koleksiyon sınıflarının her biri, koleksiyonun başına bir yineleyici döndüren bir iterator () yöntemi sağlar. Bu arabirimin yinelenebilir özellikten avantajı, bu arabirim ile bir koleksiyondaki öğeleri ekleyebileceğiniz, değiştirebileceğiniz veya kaldırabilmenizdir . Ancak, öğelere erişmek, yinelenebilirden biraz daha fazla koda ihtiyaç duyar. Örneğin:

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

Kaynaklar:

  1. Java Belgesi Yinelenebilir
  2. Java Belgesi Yineleyicisi

0

Iterable Java'daki her döngü için kullanılmak üzere tanıtıldı

public interface Collection<E> extends Iterable<E>  

Iteratorbir Iterable. Mevcut yinelemede nerede olduğumuzu korur ve bir sonraki öğenin ne olduğunu ve nasıl elde edileceğini bilir.


So hoş geldiniz, her zaman burada tur alabilir , böylece cevabınız daha yararlı ve temiz olacaktır. Bizim durumumuzda soru iki sınıfla ilgili bir açıklama istemektedir, ancak cevabınız bir şeyleri temizlemek yerine oldukça kafa karıştırıcıdır. Ayrıca cevabınızı daha somut hale getirmek için bilinen / geçerli / sertifikalı kaynaklardan snippet gönderirken bir ref tutmaya çalışın.
AntJavaDev
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.