Java'da yeniyim ve yineleyici ve yinelenebilir ile gerçekten kafam karıştı. Birisi bana açıklayabilir ve bazı örnekler verebilir mi?
Java'da yeniyim ve yineleyici ve yinelenebilir ile gerçekten kafam karıştı. Birisi bana açıklayabilir ve bazı örnekler verebilir mi?
Yanıtlar:
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 Iterable
herhangi bir sayıda geçerli Iterator
s üretebilmelidir .
Uygulaması, Iterable
aş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 .
Daha iyi anlamanıza yardımcı olmak için özellikle ArrayList ile ilgili soruyu örnek olarak cevaplayacağım.
public interface Iterable { ... abstract Iterator<T> iterator(); //Returns an 'Iterator'(not iterator) over elements of type T. ... }
public interface Iterator { ... abstract boolean hasNext(); //Returns true if the iteration has more elements. abstract E next(); //Returns the next element in the iteration. ... }
'Tekrarlanabilir <- Koleksiyon <- Liste <- ArrayList'
. Yinelenebilir, Koleksiyon ve Liste sadece 'iterator ()' soyut yöntemini beyan eder ve ArrayList tek başına bunu uygular.
'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]; } ... } }
İş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ı? :)
Iterable<T>
bu senaryoda olan bir yöntem yazmak istersem ne adımları uygulamalıyız? Lütfen bu örneği de önerin.
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.
java.lang.Iterable
mi?
java.lang.Iterable
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.
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.
As açıkladı Burada , “ iterable ” in kullanabilmek tanıtıldı foreach
dö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.
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.
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ı
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
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.
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:
Iterable
Java'daki her döngü için kullanılmak üzere tanıtıldı
public interface Collection<E> extends Iterable<E>
Iterator
bir Iterable
. Mevcut yinelemede nerede olduğumuzu korur ve bir sonraki öğenin ne olduğunu ve nasıl elde edileceğini bilir.
Iterable
vardırinteral
yaexternal
yineleyici ya mümkündür bunlardan herhangi var mı?