我需要为我的List类实现我自己的迭代器,它的功能类似于Stack并实现java.lang.Iterable。在List类中实现的Iterator方法应该返回一个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() {
}
};
}
列表本身就像一个Stack一样工作。它有一个begin条目来标记列表的开始。每个条目都包含对下一个条目的引用。使用pos元素,列表跟踪它的位置。advance()方法允许您逐项传递列表条目。elem()方法返回条目在pos位置的值。add()方法在列表的末尾添加一个条目。delete()方法删除pos处的条目。
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 ()方法中抛出了一个字符串。
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 + " ");
}
}
}
我的问题是,为什么迭代器在最后一次输入后超出边界,以及如何防止这种情况发生。
发布于 2018-06-05 06:27:46
因此,解决方案是hasNext()方法
@Override
public boolean hasNext() {
if(pos.next != null) {
return true;
}
else {
return false;
}
}
应该是
@Override
public boolean hasNext() {
if(it.next != null) {
return true;
}
else {
return false;
}
}
因为hasNext()和next()都不应该干扰pos元素。迭代器应该保持自己的位置独立于类的其余部分。
https://stackoverflow.com/questions/50688273
复制相似问题