Мне нужно реализовать свой собственный итератор для моего класса List, который функционирует как стек и реализует java.lang.Iterable.Метод Iterator, реализованный в классе List, должен возвращать Iterator.
@Override
public Iterator<E> iterator() {
return new Iterator<>() {
private MyEntry<E> it = begin;
@Override
public boolean hasNext() {
if(pos.next != null) {
return true;
}
else {
return false;
}
}
@Override
public E next() {
if (!hasNext()) {
reset();
}
else {
it = it.next;
}
return it.o;
}
@Override
public void remove() {
}
};
}
Сам список работает как стек.Он имеет начальную запись, которая отмечает начало списка.Каждая запись содержит ссылку на следующую запись.С помощью элемента pos список отслеживает свою позицию.Метод advance () позволяет вам пройти через список Entry by Entry.Метод elem () возвращает значение, которое Entry хранит в позиции pos.Метод add () добавляет запись в конец списка.Метод delete () удаляет запись в позиции.
import java.util.Iterator;
import java.util.NoSuchElementException;
public class MyList<E> implements Cloneable, java.lang.Iterable {
public MyList() {
pos = begin = new MyEntry<E>();
}
public boolean empty() {
return begin.next == null;
}
public boolean endpos() { // true, if end has been reached
return pos.next == null;
}
public void reset() {
pos = begin;
}
public void advance() {
if (endpos()) {
throw new NoSuchElementException("Already at the end of this List");
}
pos = pos.next;
}
public E elem() {
if (endpos()) {
throw new NoSuchElementException("Already at the end of this List");
}
return pos.next.o;
}
public void add(E x) {
MyEntry<E> newone = new MyEntry<E>(x, pos.next);
pos.next = newone;
}
public void delete() {
if (endpos()) {
throw new NoSuchElementException("Already at the end of this List");
}
pos.next = pos.next.next;
}
Записи, которые содержит список, имеют общее значение o и ссылку на следующую MyEntry
class MyEntry<E> {
MyEntry<E> next;
E o;
MyEntry() {
this(null, null);
}
MyEntry(E o) {
this(o, null);
}
MyEntry(E o, MyEntry<E> e) {
this.o = o;
this.next = e;
}
}
, но вВ тот момент, когда я тестирую его с помощью моего тестового класса MyListTest, я получаю три тестовые строки, но после этого программа выдает NullPointerException в методе next () при возврате it.o
import org.junit.Test;
import java.util.*;
public class MyListTest {
@Test
public void test() {
MyList list = new MyList();
Iterator itr = list.iterator();
list.add("a");
list.add("b");
list.add("c");
while(itr.hasNext()) {
Object element = itr.next();
System.out.println(element + " ");
}
iter.remove();
while(itr.hasNext()) {
Object element = itr.next();
System.out.println(element + " ");
}
}
}
Мой вопрос заключается в том, почему после последней записи у Итератора заканчиваются границы и как я могу это предотвратить.