Jaka jest różnica między iteratorem a iterable i jak z nich korzystać?
Jestem nowy w Javie i jestem naprawdę mylony z iteratorem i iterable. Czy ktoś może mi wyjaśnić i podać jakieś przykłady?
12 answers
An {[0] } jest prostą reprezentacją szeregu elementów, które można iterować. Nie posiada żadnego stanu iteracji, takiego jak "bieżący element". Zamiast tego ma jedną metodę, która wytwarza Iterator
.
An {[1] } 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 wyprodukować dowolną liczbę ważnych Iterator
s.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-07-28 17:41:40
Implementacja Iterable
to taka, która sama w sobie dostarcza Iterator
:
public interface Iterable<T>
{
Iterator<T> iterator();
}
Iterator jest prostym sposobem pozwalającym niektórym na zapętlenie zbioru danych bez przypisania uprawnień (choć z możliwością ich usunięcia).
public interface Iterator<E>
{
boolean hasNext();
E next();
void remove();
}
ZobaczJavadoc .
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-01-29 14:54:52
Iterable: interfejs, który można iterować. Oznacza to, że taki, który ma pojęcie " get me the first thing, now the next thing, and so on, until we run out."
Iterator: interfejs, który zarządza iteracją przez iterable. Oznacza to, że śledzi to, gdzie jesteśmy w bieżącej iteracji i wie, jaki jest następny element i jak go zdobyć.
Aby obiekt mógł być powtarzalny, musi on emitować obiekt Iterator
. Aby wyegzekwować niniejszą Umowę, można interfejs ma być używany. Zawiera on metodę o nazwie iterator () i zwraca Iterator. Dlatego każda klasa implementująca Iterable zwróci Iterator.
public interface Collection<E> extends Iterable<E> {}
Na przykład weźmy dowolny zbiór. Zbiór jest interfejsem reprezentującym kontener dla szeregu elementów. Każdy zbiór jak ArrayList, Vector implementuje zbiór a więc Iterator.
Jedną z zalet Iterable jest to, że po zaimplementowaniu Iterable obiekt otrzymuje wsparcie dla składni for: each loop.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-18 17:17:55
Jeśli zbiór jest iteracyjny, to może być iteracyjny za pomocą iteratora (i w konsekwencji może być użyty w for each loop.) Iterator jest faktycznym obiektem, który będzie iteracją poprzez kolekcję.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-07-28 17:39:46
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 jest interfejsem, który posiada implementację do iteracji elementów. Iterable jest interfejsem, który zapewnia Iterator.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-07-07 13:30:01
Najważniejszą kwestią jest to, czy przedmiot, o którym mowa, powinien być w stanie przejść więcej niż jeden raz. Dzieje się tak dlatego, że zawsze możesz przewijać iterowalne wywołując ponownie iterator (), ale nie ma możliwości przewijania iteratora.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-08-27 03:37:54
Odpowiem na pytanie szczególnie o ArrayList jako przykład, aby pomóc ci lepiej zrozumieć..
- Interfejs Iterable zmusza swoje podklasy do implementacji abstrakcyjnej metody ' iterator ()'.
public interface Iterable { ... abstract Iterator<T> iterator(); //Returns an 'Iterator'(not iterator) over elements of type T. ... }
- Interfejs iteratora zmusza swoje podklasy do implementacji abstrakcyjnych metod 'hasNext () 'i'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. ... }
- ArrayList implementuje listę, List implementuje kolekcję i Collection implementuje Iterowalne..
To jest, można było zobaczyć związek jak
'Iterable
. I Iterable, Collection I List po prostu deklarują abstrakcyjną metodę 'iterator ()' i ArrayList samodzielnie ją implementuje.
- pokażę kod źródłowy ArrayList z metodą 'iterator ()' w następujący sposób, aby uzyskać bardziej szczegółowe informacje.
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]; } ... } }
- niektóre inne metody lub klasy będą iteracją elementów kolekcji, takich jak ArrayList, poprzez wykorzystanie iteratora (Itr).
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? :)Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-02-02 08:12:18
Mówiąc ogólnie, obie są ze sobą bardzo blisko spokrewnione.
Rozważ Iterator jako interfejs, który pomaga nam w przechodzeniu przez kolekcję za pomocą niektórych niezdefiniowanych metod, takich jak hasNext (), next() I remove()
Z drugiej strony, Iterable jest innym interfejsem, który, jeśli zostanie zaimplementowany przez klasę, wymusza, aby klasa była Iterable i jest celem dla każdej konstrukcji For. Posiada tylko jedną metodę o nazwie iterator (), która pochodzi z samego interfejsu iteratora.
Gdy zbiór jest iteracyjny, to może być iteracyjny za pomocą iteratora.
Dla zrozumienia odwiedź Te:
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
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-06-07 15:11:00
Rozważ przykład mający 10 jabłek. Kiedy implementuje Iterable, to jest jak umieszczenie każdego apple w polach od 1 do 10 i zwrócić iterator, który może być używany do nawigacji.
Implementując iterator możemy uzyskać dowolne jabłko, jabłko w kolejnych polach itp.
Tak więc implementacja iterable daje iteratorowi do poruszania się po jego elementach, chociaż aby nawigować, iterator musi być zaimplementowany..
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-08-17 06:08:13
Jak wyjaśniono tutaj , wprowadzono " Iterable", aby móc korzystać z pętli foreach
. Klasa implementująca interfejs Iterowalny może być iterowana.
Iterator jest klasą, która zarządza iteracją przez Iterable . Utrzymuje stan, gdzie jesteśmy w bieżącej iteracji i wie, jaki jest następny element i jak go uzyskać.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-11-14 07:01:32
Pytanie: różnica między Iterable i Iterator?
Ans:
Iterable: jest związany z pętlą forEach
iterator: is jest powiązany ze zbiorem
Element docelowy pętli forEach shouble jest iterowalny.
Możemy użyć iteratora, aby uzyskać obiekt jeden po drugim z kolekcji
Iterable present in java.ḷang Pakiet
Iterator obecny w Javie.pakiet util
Zawiera tylko jedną metodę iterator ()
Zawiera trzy metody hasNext (), next(), remove ()
Wprowadzony w wersji 1.5
Wprowadzono w wersji 1.2
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-04-28 20:02:51
oprócz odpowiedzi ColinD i Seeker.
W prostych słowach, Iterablei Iterator są interfejsami dostarczanymi w Java Collection Framework.
Iterable
Klasa musi zaimplementować interfejs Iterowalny, jeśli chce mieć pętlęfor-each do iteracji nad jej kolekcją. Jednak pętla for-each może być używana tylko do przechodzenia przez zbiór w przód kierunek i nie będzie można modyfikować elementów w tej kolekcji . Ale jeśli chcesz tylko odczytać dane elements, to jest to bardzo proste i dzięki Java lambda expression jest to często jeden liner. 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 dostarcza metodę iterator () , która zwraca iterator na początek kolekcji. Zaletą tego interfejsu nad możliwością iteracji jest to, że za pomocą tego interfejsu można dodawać, modyfikować lub usuwać elementy w kolekcji. Ale dostęp do elementów wymaga trochę więcej kodu niż iterable. 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:
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-31 15:05:01