Jestem nowy w Javie i naprawdę mylę się z iteratorem i iterowalnością. Czy ktoś może mi wyjaśnić i podać kilka przykładów?
Jestem nowy w Javie i naprawdę mylę się z iteratorem i iterowalnością. Czy ktoś może mi wyjaśnić i podać kilka przykładów?
Odpowiedzi:
Jest Iterable
to prosta reprezentacja szeregu elementów, które można iterować. Nie ma żadnego stanu iteracji, takiego jak „bieżący element”. Zamiast tego ma jedną metodę, która tworzyIterator
.
An Iterator
jest obiektem ze stanem iteracji. Pozwala sprawdzić, czy ma więcej elementów za pomocą hasNext()
i przejść do następnego elementu (jeśli istnieje) za pomocą next()
.
Zazwyczaj Iterable
powinien być w stanie wygenerować dowolną liczbę poprawnych Iterator
s.
Implementacja Iterable
to taka, która zapewnia Iterator
:
public interface Iterable<T>
{
Iterator<T> iterator();
}
Iterator to prosty sposób pozwalający niektórym przeglądać kolekcję danych bez uprawnień do przypisywania (choć z możliwością usuwania).
public interface Iterator<E>
{
boolean hasNext();
E next();
void remove();
}
Zobacz Javadoc .
Odpowiem na pytanie szczególnie o ArrayList jako przykład, aby pomóc Ci lepiej zrozumieć ..
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 <- Collection <- List <- ArrayList”
. Iterable, Collection i List deklarują po prostu metodę abstrakcyjną „iterator ()”, a sama ArrayList ją implementuje.
Metoda „iterator ()” zwraca obiekt klasy „Itr”, który implementuje „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]; } ... } }
Oto prosty przykład.
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);
}
}
Czy to jasne? :)
Iterable<T>
w tym scenariuszu, jakie kroki musimy wdrożyć? Proszę również zasugerować ten przykład.
Jeśli kolekcja jest iterowalna, to można ją iterować za pomocą iteratora (i w konsekwencji można go użyć w pętli dla każdej). Iterator jest rzeczywistym obiektem, który będzie iterował przez kolekcję.
java.lang.Iterable
?
java.lang.Iterable
Implementacja interfejsu Iterable pozwala obiektowi być celem instrukcji „foreach”.
class SomeClass implements Iterable<String> {}
class Main
{
public void method()
{
SomeClass someClass = new SomeClass();
.....
for(String s : someClass) {
//do something
}
}
}
Iterator to interfejs, który ma implementację do iteracji elementów. Iterable to interfejs zapewniający Iterator.
Najważniejszą kwestią jest to, czy dany przedmiot powinien być dostępny więcej niż jeden raz. Wynika to z faktu, że zawsze można przewinąć Iterator, wywołując ponownie iterator (), ale nie ma sposobu na przewinięcie Iteratora.
Jak wyjaśniono tutaj , „ Iterable ” został wprowadzony, aby móc używać go w foreach
pętli. Klasa implementująca interfejs Iterable może być iterowana.
Iterator jest klasa, która zarządza iteracji nad iterable . Utrzymuje stan, w którym znajdujemy się w bieżącej iteracji, i wie, jaki jest następny element i jak go uzyskać.
Rozważ przykład z 10 jabłkami. Kiedy implementuje Iterable, przypomina to umieszczenie każdego jabłka w pudełkach od 1 do 10 i zwrócenie iteratora, którego można użyć do nawigacji.
Wdrażając iterator, możemy uzyskać dowolne jabłko, jabłko w kolejnych polach itp.
Tak więc implementacja iterable daje iteratorowi nawigację po jego elementach, chociaż aby nawigować, iterator musi zostać zaimplementowany.
Pytanie: Różnica między Iterable i Iterator?
Odp .:
iterable: Jest powiązany z
iteratorem pętli forEach : Jest powiązany z kolekcją
Element docelowy pętli forEach powinien być powtarzalny.
Możemy użyć Iteratora, aby pobrać obiekt jeden po drugim z Kolekcji
Iterable obecny w pakiecie java.ḷang
Iterator obecny w pakiecie java.util
Zawiera tylko jedną metodę iteratora ()
Zawiera trzy metody hasNext (), next (), remove ()
Wprowadzono w wersji 1.5
Wprowadzono w wersji 1.2
Zasadniczo oba są ze sobą ściśle powiązane.
Rozważmy Iterator jako interfejs, który pomaga nam przechodzić przez kolekcję za pomocą niektórych niezdefiniowanych metod, takich jak hasNext (), next () i remove ()
Z drugiej strony, Iterable to kolejny interfejs, który, jeśli jest zaimplementowany przez klasę, wymusza klasę Iterable i jest celem dla konstrukcji For-Each. Ma tylko jedną metodę o nazwie iterator (), która pochodzi z samego interfejsu Iterator.
Gdy kolekcja jest iterowalna, można ją iterować za pomocą iteratora.
Dla zrozumienia odwiedź:
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
Wiem, że to stare pytanie, ale dla każdego, kto czyta to pytanie, które utknęło z tym samym pytaniem i które może być przytłoczone całą terminologią, oto dobra, prosta analogia, która pomoże ci zrozumieć to rozróżnienie między iteratorami a iteratorami:
Pomyśl o bibliotece publicznej. Stara szkoła. Z papierowymi książkami. Tak, taka biblioteka.
Półka pełna książek przypominałaby iterację. Na półce widać długą linię książek. Możesz nie wiedzieć ile, ale możesz zobaczyć, że jest to długi zbiór książek.
Bibliotekarz byłby jak iterator. Może wskazać konkretną książkę w dowolnym momencie. Może wstawiać / usuwać / modyfikować / czytać książkę w miejscu, w którym wskazuje. Wskazuje kolejno każdą książkę za każdym razem, gdy krzyczysz „dalej!” do niego. Zwykle pytasz go: „ma Dalej?”, A on powie „tak”, na co mówisz „dalej!”. i wskaże następną książkę. Wie również, kiedy dotarł do końca półki, więc kiedy zapytasz: „ma Dalej?” powie „nie”.
Wiem, że to trochę głupie, ale mam nadzieję, że to pomoże.
Oprócz odpowiedzi ColinD i Seeker .
W prostych słowach Iterable i Iterator to interfejsy dostarczone w Java's Collection Framework.
Iterowalny
Klasa musi zaimplementować interfejs Iterable, jeśli chce mieć pętlę „ for-each” w celu iteracji swojej kolekcji. Jednak for-each pętli może być używany tylko do cyklu poprzez gromadzenie w kierunku do przodu i nie będzie mógł modyfikować elementy w tej kolekcji . Ale jeśli wszystko, czego chcesz, to odczyt danych elementów, to jest to bardzo proste, a dzięki wyrażeniu lambda Java jest to często jedna linijka. Na przykład:
iterableElements.forEach (x -> System.out.println(x) );
Iterator
Ten interfejs umożliwia iterację kolekcji, uzyskiwanie i usuwanie jej elementów. Każda z klas kolekcji udostępnia metodę iteratora () , która zwraca iterator na początek kolekcji. Zaletą tego interfejsu nad iteracją jest to, że za pomocą tego interfejsu można dodawać, modyfikować lub usuwać elementy w kolekcji . Jednak dostęp do elementów wymaga nieco więcej kodu niż iteracji. Na przykład:
for (Iterator i = c.iterator(); i.hasNext(); ) {
Element e = i.next(); //Get the element
System.out.println(e); //access or modify the element
}
Źródła:
Iterable
zostały wprowadzone do użycia dla każdej pętli w java
public interface Collection<E> extends Iterable<E>
Iterator
to klasa zarządzająca iteracją nad Iterable
. Utrzymuje stan, w którym znajdujemy się w bieżącej iteracji, i wie, jaki jest następny element i jak go uzyskać.
Iterable
mainteral
lubexternal
iterator, czy można mieć którekolwiek z nich?