2013-09-04 15 views
5

Jestem nieco zdezorientowany, jak zaimplementować niestandardowy iterator dla klasy w Javie. Muszę zasadniczo utworzyć ArrayList bez korzystania z wbudowanych bibliotek, które już mam do dyspozycji. Rozumiem podstawy tworzenia klasy, ale mam problem ze zrozumieniem, jak dopasować Iterator do tego wszystkiego. Mam następujący:Tworzenie niestandardowej Iterator Java?

Stworzyłem rodzajowe klasy, która implementuje interfejs iterowalny jako taki wygląda mniej więcej tak:

public class MyArrayList<T> implements Iterable<T> { 

Mam następnie dostał się do utworzenia klasy o nazwie MyIterator która według sformułowanie dokumentu jest samodzielną klasą. Wydaje się to dość proste robię nową klasę o nazwie MyIterator i mieć go implementować interfejs iteratora tak to wygląda mniej więcej tak:

public class MyIterator<T> implements Iterator<T>{ 

My zamieszanie leży poniżej. Dokument mówi, że Iterator musi być w swojej klasie, ale jak mam uzyskać dostęp do elementów danych w "MyArrayList", aby w pełni zaimplementować na przykład metody hasNext() i next(). Ponieważ elementy danych w podstawowej tablicy są prywatne (tak jak powinny być), nie widzę, w jaki sposób klasa zewnętrzna może w pełni wdrożyć te metody. Czy nie rozumiem, co jest wymagane? Czy przez oddzielną klasę nadal jest częścią klasy "MyArrayList", ale definiuje się ją inaczej?

Mam nadzieję, że pomaga, jak powiedziałem, myślę, że rozumiem, co jest wymagane ode mnie, po prostu nie jestem dokładnie pewien, gdzie mój Iterator pasuje do tego wszystkiego.

+0

'MyArrayList # iterator()' zwraca 'nowy MyIterator (this)' albo jakoś przechodzi odniesienie do siebie i tym samym daje dostęp do danych – zapl

+0

Więc jest częścią MyIterator z MyArrayList klasy czy też normalnie iść w jego własnym , to jest miejsce, w którym jestem zdezorientowany, nie bardzo wiem "gdzie" idzie Iterator, jeśli to ma jakiś sens. Wiem, co powinna zrobić metoda iterator(), ale nie wiem, gdzie powinienem dodać kod dla mojego niestandardowego iteratora, aby mógł utworzyć jego instancję i wywołać go, gdy jest to potrzebne. – Scott

Odpowiedz

6

Podczas gdy iterator musi być oddzielną klasą *, ta klasa będzie prawdopodobnie miała jakiś związek z twoją klasą Iterable.

Często jest to klasa zagnieżdżona/wewnętrzna, właśnie dlatego, że musi uzyskać dostęp do wartości klasy (i na tym właśnie polega klasa wewnętrzna).

prawda, jeśli Iterable jest List można wdrożyć Iterator bez „wewnętrzną” dostępu w ogóle, ale zazwyczaj nadal chcesz uzyskać dostęp do wewnętrznych na takie rzeczy jak sprawdzanie modCount (rzucać ConcurrentModificationException gdy Iterable jest modyfikowany strukturalnie podczas iteracji nad nim ... i do uniemożliwić ten wyjątek, jeśli zmodyfikujesz go poprzez samą Iterator).

* ty mógłby wdrożyć go z samej instancji Iterable, ale to by zerwać kontrakt, gdy tylko użytkownik wykorzystuje dwa iteratory w tym samym czasie.

+0

Więc zasadniczo chcę mieć skonfigurować podobny do następującego: public class MyArrayList realizuje iterowalny { publiczny klasa MyIterator implementuje Iterator { } } EDIT: Niestety nie mogę pracować jak uzyskać formatowanie kodu działające w komentarzach. – Scott

+0

@ gRnt Dokładnie - implementacja iteratora może/powinna być prywatną klasą, ponieważ nikt nie musi widzieć klasy. PS: wstaw kod do ', aby sformatować go w tekście. http://stackoverflow.com/editing-help#comment-formatting – zapl

+0

Dziękuję, myślę, że mylę "swoją własną klasę", nie będąc klasą zagnieżdżoną! – Scott

1

Musisz zadeklarować własne metody hasNext(), next(), remove(). Musi wiedzieć, jak iterować po własnej klasie, jak przejść do następnego elementu i jak sprawdzić, czy następny element istnieje.