Saya baru di Jawa dan saya benar-benar bingung dengan iterator dan iterable. Adakah yang bisa menjelaskan kepada saya dan memberikan beberapa contoh?
Saya baru di Jawa dan saya benar-benar bingung dengan iterator dan iterable. Adakah yang bisa menjelaskan kepada saya dan memberikan beberapa contoh?
Jawaban:
An Iterable
adalah representasi sederhana dari serangkaian elemen yang dapat diulangi. Itu tidak memiliki keadaan iterasi seperti "elemen saat ini". Sebaliknya, ia memiliki satu metode yang menghasilkan Iterator
.
An Iterator
adalah objek dengan status iterasi. Ini memungkinkan Anda memeriksa apakah ada lebih banyak elemen yang digunakan hasNext()
dan pindah ke elemen berikutnya (jika ada) menggunakan next()
.
Biasanya, suatu Iterable
harus dapat menghasilkan sejumlah Iterator
s yang valid .
Implementasi Iterable
adalah yang menyediakan Iterator
sendiri:
public interface Iterable<T>
{
Iterator<T> iterator();
}
Iterator adalah cara sederhana yang memungkinkan beberapa orang untuk mengulang koleksi data tanpa hak penugasan (meskipun dengan kemampuan untuk menghapus).
public interface Iterator<E>
{
boolean hasNext();
E next();
void remove();
}
Lihat Javadoc .
Saya akan menjawab pertanyaan terutama tentang ArrayList sebagai contoh untuk membantu Anda memahami lebih baik ..
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. ... }
'Iterable <- Koleksi <- Daftar <- ArrayList'
. Dan Iterable, Collection and List hanya mendeklarasikan metode abstrak 'iterator ()' dan ArrayList sendiri yang mengimplementasikannya.
Metode 'iterator ()' mengembalikan objek kelas 'Itr' yang mengimplementasikan '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]; } ... } }
Ini adalah contoh sederhana.
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);
}
}
Sekarang, apakah sudah jelas? :)
Iterable<T>
dalam skenario ini langkah-langkah apa yang perlu kita terapkan? Tolong sarankan contoh itu juga.
Jika koleksi iterable, maka dapat iterasi menggunakan iterator (dan akibatnya dapat digunakan dalam untuk setiap loop.) Iterator adalah objek aktual yang akan beralih melalui koleksi.
java.lang.Iterable
?
java.lang.Iterable
Menerapkan antarmuka Iterable memungkinkan objek untuk menjadi target pernyataan "foreach".
class SomeClass implements Iterable<String> {}
class Main
{
public void method()
{
SomeClass someClass = new SomeClass();
.....
for(String s : someClass) {
//do something
}
}
}
Iterator adalah antarmuka, yang memiliki implementasi untuk beralih pada elemen. Iterable adalah antarmuka yang menyediakan Iterator.
Pertimbangan yang paling penting adalah apakah barang yang dimaksud harus dapat dilintasi lebih dari satu kali. Ini karena Anda selalu dapat memundurkan Iterable dengan memanggil iterator () lagi, tetapi tidak ada cara untuk memundurkan Iterator.
Seperti yang dijelaskan di sini , " Iterable " diperkenalkan untuk dapat digunakan dalam foreach
loop. Kelas yang mengimplementasikan antarmuka Iterable dapat diulangi.
Iterator adalah kelas yang mengelola iterasi di atas Iterable . Itu mempertahankan keadaan di mana kita berada dalam iterasi saat ini, dan tahu apa elemen berikutnya dan bagaimana mendapatkannya.
Pertimbangkan contoh memiliki 10 buah apel. Ketika mengimplementasikan Iterable, itu seperti menempatkan setiap apel dalam kotak dari 1 hingga 10 dan mengembalikan iterator yang dapat digunakan untuk bernavigasi.
Dengan menerapkan iterator, kita bisa mendapatkan apel, apel di kotak selanjutnya dll.
Jadi menerapkan iterable memberikan iterator untuk menavigasi elemen-elemennya meskipun untuk menavigasi, iterator perlu diimplementasikan.
Pertanyaan: Perbedaan antara Iterable dan Iterator?
Jawab:
iterable: Hal ini terkait dengan
iterator forEach loop : Apakah terkait dengan Koleksi
Elemen target dari forEach loop harus digandakan iterable.
Kita dapat menggunakan Iterator untuk mendapatkan objek satu per satu dari Koleksi
Iterable hadir dalam paket java.ḷang
Iterator hadir dalam paket java.util
Hanya mengandung satu metode iterator ()
Berisi tiga metode hasNext (), next (), hapus ()
Diperkenalkan dalam versi 1.5
Diperkenalkan dalam versi 1.2
Pada dasarnya, keduanya terkait erat satu sama lain.
Pertimbangkan Iterator sebagai antarmuka yang membantu kita dalam menelusuri koleksi dengan bantuan beberapa metode yang tidak ditentukan seperti hasNext (), next () dan hapus ()
Di sisi lain, Iterable adalah antarmuka lain, yang, jika diimplementasikan oleh suatu kelas memaksa kelas untuk menjadi Iterable dan merupakan target untuk setiap konstruksi. Ini hanya memiliki satu metode bernama iterator () yang berasal dari antarmuka Iterator itu sendiri.
Ketika koleksi iterable, maka dapat diulang menggunakan iterator.
Untuk memahami, kunjungi ini:
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
Saya tahu ini adalah pertanyaan lama, tetapi bagi siapa pun yang membaca ini yang terjebak dengan pertanyaan yang sama dan yang mungkin kewalahan dengan semua terminologi, inilah analogi sederhana dan bagus untuk membantu Anda memahami perbedaan antara iterables dan iterators:
Pikirkan perpustakaan umum. Sekolah tua Dengan buku kertas. Ya, perpustakaan seperti itu.
Rak yang penuh dengan buku akan seperti sebuah iterable. Anda bisa melihat antrean panjang buku di rak. Anda mungkin tidak tahu berapa banyak, tetapi Anda dapat melihat bahwa itu adalah koleksi buku yang panjang.
Pustakawan akan seperti iterator. Dia dapat menunjuk ke buku tertentu kapan saja. Dia dapat memasukkan / menghapus / memodifikasi / membaca buku di lokasi yang ditunjuknya. Dia menunjuk, secara berurutan, ke setiap buku sekaligus setiap kali Anda berteriak "selanjutnya!" untuk dia. Jadi, Anda biasanya akan bertanya kepadanya: "memiliki Berikutnya?", Dan dia akan berkata "ya", yang Anda katakan "selanjutnya!" dan dia akan menunjuk ke buku berikutnya. Dia juga tahu kapan dia mencapai ujung rak, sehingga ketika Anda bertanya: "Apakah Berikutnya?" dia akan mengatakan "tidak".
Saya tahu ini agak konyol, tapi saya harap ini bisa membantu.
Selain jawaban ColinD dan Seeker .
Dalam istilah sederhana, Iterable dan Iterator keduanya adalah antarmuka yang disediakan dalam Java's Framework Framework.
Iterable
Sebuah kelas harus mengimplementasikan antarmuka Iterable jika ingin memiliki untuk-setiap loop untuk beralih ke koleksi. Namun, untuk-setiap loop hanya dapat digunakan untuk menggilir koleksi di arah maju dan Anda tidak akan dapat memodifikasi elemen dalam koleksi ini . Tetapi, jika semua yang Anda inginkan adalah membaca elemen data, maka itu sangat sederhana dan berkat ekspresi lambda Java sering liner. Sebagai contoh:
iterableElements.forEach (x -> System.out.println(x) );
Iterator
Antarmuka ini memungkinkan Anda untuk beralih ke koleksi, mendapatkan dan menghapus elemen-elemennya. Setiap kelas koleksi menyediakan metode iterator () yang mengembalikan iterator ke awal koleksi. Keuntungan dari antarmuka ini lebih dari itu adalah bahwa dengan antarmuka ini Anda dapat menambah, memodifikasi atau menghapus elemen dalam koleksi . Tetapi, mengakses elemen membutuhkan kode yang lebih banyak daripada yang dapat dilakukan. Sebagai contoh:
for (Iterator i = c.iterator(); i.hasNext(); ) {
Element e = i.next(); //Get the element
System.out.println(e); //access or modify the element
}
Sumber:
Iterable
diperkenalkan untuk digunakan dalam untuk setiap loop di java
public interface Collection<E> extends Iterable<E>
Iterator
adalah kelas yang mengatur iterasi lebih dari satu Iterable
. Itu mempertahankan keadaan di mana kita berada dalam iterasi saat ini, dan tahu apa elemen berikutnya dan bagaimana mendapatkannya.
Iterable
memilikiinteral
atauexternal
mengulangi atau mungkin untuk memilikinya?