Jeśli mam listę zawierającą [alice, bob, abigail, charlie]i chcę napisać iterator tak, aby iterował po elementach zaczynających się od „a”, czy mogę napisać własny? Jak mogę to zrobić ?
Pewnie. Iterator to po prostu implementacja java.util.Iteratorinterfejsu. Jeśli używasz istniejącego iterowalnego obiektu (powiedzmy a LinkedList) from java.util, będziesz musiał albo podklasować go i nadpisać jego iteratorfunkcję, aby zwrócić własną, albo zapewnić sposób zawijania standardowego iteratora w swojej specjalnej Iteratorinstancji (która ma tę zaletę, że jest szerzej stosowany) itp.
dobra odpowiedź .... +1 Jednak nie jesteś zmuszony do podklasy LinkedList. Możesz napisać CustomIterator, który jest tworzony przy użyciu nowego CustomIterator (somelist), ponieważ interfejsy nie mówią nic o konstruktorach.
gd1
1
@Giacomo: To właśnie miałem na myśli, mówiąc „... lub zapewnij sposób umieszczenia standardowego iteratora w twojej specjalnej Iteratorinstancji ...” (i dzięki). :-)
TJ Crowder
197
Najlepszą opcją wielokrotnego użytku jest zaimplementowanie interfejsu Iterable i nadpisanie metody iterator ().
Oto przykład klasy podobnej do ArrayList implementującej interfejs, w której przesłaniasz metodę Iterator ().
Ta klasa implementuje interfejs Iterable przy użyciu typów Generics . Biorąc pod uwagę, że masz elementy tablicy, będziesz w stanie uzyskać instancję Iteratora, która jest potrzebną instancją używaną na przykład przez pętlę „foreach”.
Możesz po prostu utworzyć anonimową instancję iteratora bez tworzenia rozszerzającego Iteratora i skorzystać z wartości currentSize, aby zweryfikować miejsce, w którym możesz nawigować po tablicy (powiedzmy, że utworzyłeś tablicę o pojemności 10, ale masz tylko 2 elementy na 0 i 1). Instancja będzie miała swój licznik właściciela wskazujący, gdzie się znajduje, a wszystko, co musisz zrobić, to skorzystać z funkcji hasNext (), która sprawdza, czy bieżąca wartość nie jest null, oraz funkcji next (), która zwróci instancję Twojego currentIndex. Poniżej znajduje się przykład użycia tego interfejsu API ...
publicstaticvoid main(String[] args){// create an array of type IntegerInteger[] numbers =newInteger[]{1,2,3,4,5};// create your list and hold the values.SOList<Integer> stackOverflowList =newSOList<Integer>(numbers);// Since our class SOList is an instance of Iterable, then we can use it on a foreach loopfor(Integer num : stackOverflowList){System.out.print(num);}// creating an array of StringsString[] languages =newString[]{"C","C++","Java","Python","Scala"};// create your list and hold the values using the same list implementation.SOList<String> languagesList =newSOList<String>(languages);System.out.println("");// Since our class SOList is an instance of Iterable, then we can use it on a foreach loopfor(String lang : languagesList){System.out.println(lang);}}// will print "12345//C//C++//Java//Python//Scala
Jeśli chcesz, możesz go również iterować za pomocą instancji Iterator:
// navigating the iteratorwhile(allNumbers.hasNext()){Integer value = allNumbers.next();if(allNumbers.hasNext()){System.out.print(value +", ");}else{System.out.print(value);}}// will print 1, 2, 3, 4, 5
Teraz, aby uzyskać efekty tego, czego potrzebujesz, myślę, że musisz podłączyć koncepcję filtru do Iteratora ... Ponieważ iterator zależy od następnych wartości, trudno byłoby zwrócić true w hasNext (), a następnie filtruj implementację next () z wartością, która nie zaczyna się na przykład od znaku „a”. Myślę, że musisz pobawić się dodatkowym Interatorem w oparciu o przefiltrowaną listę z wartościami z podanym filtrem.
Dobrą praktyką jest zgłoszenie nieobsługiwanego wyjątku operacji z naszych zaimplementowanych metod. Myślę, że dobrym pomysłem jest zgłoszenie wyjątku nieobsługiwanej operacji z metody remove ()!
darszan
2
Przepraszam @darshan, ale to rozwiązanie dotyczy „jak pisać iteratory” ... Gdyby celem było „pisanie doskonale napisanego kodu”, to by tam było!
Marcello de Sales,
nie jest jasne, dlaczego sprawdzenie „arrayList [currentIndex]! = null” jest wymagane w hasNext (). czy ktoś może wyjaśnić.
Bhushan Karmarkar
12
Dobry przykład dla Iterable do obliczania silni
FactorialIterable fi =newFactorialIterable(10);Iterator<Integer> iterator = fi.iterator();while(iterator.hasNext()){System.out.println(iterator.next());}
Możesz zaimplementować swój własny Iterator. Twój iterator może być skonstruowany tak, aby zawijał Iterator zwracany przez List, lub możesz zachować kursor i użyć metody get (int index) listy. Musisz tylko dodać logikę do następnej metody Iteratora ORAZ metody hasNext, aby uwzględnić kryteria filtrowania. Będziesz także musiał zdecydować, czy Twój iterator będzie obsługiwał operację usuwania.
ListIterator jest iteratorem tablicy, która zwraca elementy zaczynające się od „a”.
Nie ma potrzeby implementowania interfejsu iterowalnego. Ale jest taka możliwość.
Nie ma potrzeby wdrażania tego w sposób ogólny.
W pełni spełnia warunki umowy dla hasNext () i next (). tj. jeśli hasNext () mówi, że wciąż istnieją elementy, next () zwróci te elementy. A jeśli hasNext () mówi, że nie ma więcej elementów, zwraca prawidłowy NoSuchElementExceptionwyjątek.
Odpowiedzi:
Pewnie. Iterator to po prostu implementacja
java.util.Iterator
interfejsu. Jeśli używasz istniejącego iterowalnego obiektu (powiedzmy aLinkedList
) fromjava.util
, będziesz musiał albo podklasować go i nadpisać jegoiterator
funkcję, aby zwrócić własną, albo zapewnić sposób zawijania standardowego iteratora w swojej specjalnejIterator
instancji (która ma tę zaletę, że jest szerzej stosowany) itp.źródło
Iterator
instancji ...” (i dzięki). :-)Najlepszą opcją wielokrotnego użytku jest zaimplementowanie interfejsu Iterable i nadpisanie metody iterator ().
Oto przykład klasy podobnej do ArrayList implementującej interfejs, w której przesłaniasz metodę Iterator ().
Ta klasa implementuje interfejs Iterable przy użyciu typów Generics . Biorąc pod uwagę, że masz elementy tablicy, będziesz w stanie uzyskać instancję Iteratora, która jest potrzebną instancją używaną na przykład przez pętlę „foreach”.
Możesz po prostu utworzyć anonimową instancję iteratora bez tworzenia rozszerzającego Iteratora i skorzystać z wartości currentSize, aby zweryfikować miejsce, w którym możesz nawigować po tablicy (powiedzmy, że utworzyłeś tablicę o pojemności 10, ale masz tylko 2 elementy na 0 i 1). Instancja będzie miała swój licznik właściciela wskazujący, gdzie się znajduje, a wszystko, co musisz zrobić, to skorzystać z funkcji hasNext (), która sprawdza, czy bieżąca wartość nie jest null, oraz funkcji next (), która zwróci instancję Twojego currentIndex. Poniżej znajduje się przykład użycia tego interfejsu API ...
Jeśli chcesz, możesz go również iterować za pomocą instancji Iterator:
Wszystkie dokumenty znajdują się pod adresem http://download.oracle.com/javase/1,5.0/docs/guide/language/foreach.html . Możesz rzucić okiem na bardziej kompletną implementację w moim osobistym kodzie Google .
Teraz, aby uzyskać efekty tego, czego potrzebujesz, myślę, że musisz podłączyć koncepcję filtru do Iteratora ... Ponieważ iterator zależy od następnych wartości, trudno byłoby zwrócić true w hasNext (), a następnie filtruj implementację next () z wartością, która nie zaczyna się na przykład od znaku „a”. Myślę, że musisz pobawić się dodatkowym Interatorem w oparciu o przefiltrowaną listę z wartościami z podanym filtrem.
źródło
for instance
, czy to gra słów?Dobry przykład dla Iterable do obliczania silni
Krótki kod dla Java 1.8
Niestandardowa klasa iterowalna
Niestandardowa klasa iteratora
źródło
To jest kompletny kod do napisania iteratora, który iteruje po elementach zaczynających się od „a”:
Niestandardowa klasa iteratora
źródło
Możesz zaimplementować swój własny Iterator. Twój iterator może być skonstruowany tak, aby zawijał Iterator zwracany przez List, lub możesz zachować kursor i użyć metody get (int index) listy. Musisz tylko dodać logikę do następnej metody Iteratora ORAZ metody hasNext, aby uwzględnić kryteria filtrowania. Będziesz także musiał zdecydować, czy Twój iterator będzie obsługiwał operację usuwania.
źródło
Oto pełna odpowiedź na to pytanie.
ListIterator
jest iteratorem tablicy, która zwraca elementy zaczynające się od „a”.NoSuchElementException
wyjątek.źródło