Implement the Iterator Pattern
- Write a Java class that implements the
Iterator
interface.
Part II
Here is an implementation for hasNext
and next
methods:
public class ArrayIndexedListIterator<T> implements Iterator<T> {
private T[] data;
private int cursor;
public ArrayIndexedListIterator(T[] data) {
this.data = data;
this.cursor = 0;
}
@Override
public boolean hasNext() {
return cursor < data.length;
}
@Override
public T next() {
if (!hasNext()) {
throw new NoSuchElementException();
}
return data[cursor++];
}
}
Notes:
- We need to point to the data (elements) stored in the data structure we want to iterate over (the
ArrayIndexedList
here). Thus, we keep a reference (data
) in the implementation provided here, which the constructor initializes. - We use the
cursor
to keep track of the current element. Thecursor
is the index position of the current element. A "cursor" is not always as simple as an "index." Depending on the data structure, the "cursor" may require complex implementation. hasNext
is true if thecursor
has not reached the last element.next
returns the current element pointed by thecursor
and advances thecursor
.next
should throwNoSuchElementException
when a client calls it after the iteration is over.
Now, update the implementation of ArrayIndexedList.iterator
to use ArrayIndexedListIterator
:
public class ArrayIndexedList<T> implements IndexedList<T> {
// No changes were made to other operations.
@Override
public Iterator<T> iterator() {
return new ArrayIndexedListIterator<>(this.data);
}
}
Run the tests and make sure they all pass!