我的列表如下所示:
public class SList<A> implements Iterable<A>
{
private Listelem head;
private Listelem current;
private boolean listEmpty;
private class Listelem
{
private A value;
private Listelem next;
private Listelem(A val)
{
this.value = val;
this.next = null;
}
private Listelem()
{
this.next = null;
}
public void setValue(A val)
{
this.value = val;
}
public A getValue()
{
return this.value;
}
public void setSuccessor(Listelem next)
{
this.next = next;
}
public Listelem getSuccessor()
{
return this.next;
}
}
}
我想为此列表创建一个迭代器,但我遇到了一些麻烦。 在SList我这样做:
@Override
public Iterator<A> iterator() {
Iterator<A> it = new Iterator<A>() {
this.current = this.head;
@Override
public boolean hasNext() {
boolean hasNext = true;
if( this.current.getSucessor == null )
{
hasNext = false;
}
return hasNext;
}
@Override
public A next() {
A next = this.current.getValue;
this.current = this.current.getSuccessor();
return next;
}
@Override
public void remove() {
// TODO Auto-generated method stub
}
};
return it;
}
我不能引用this.current或this.head。我想知道为什么这不起作用,因为我在同一个班级。
答案 0 :(得分:1)
您正在使用new
创建一个新的迭代器,因此您处于类的匿名内部类中。试试SList.this.current
。
答案 1 :(得分:1)
您只是忘了在迭代器中声明current
字段。并且应使用SList.this.head
或仅使用head
访问列表的头部。 this
指的是Iterator实例。不在列表中。您应该使用非匿名类:
@Override
public Iterator<A> iterator() {
return new MyListIterator();
}
private class MyListIterator implements Iterator<A> {
private Listelem current;
private MyListIterator() {
this.current = head;
}
@Override
public boolean hasNext() {
return this.current.getSucessor != null;
}
@Override
public A next() {
A next = this.current.getValue;
this.current = this.current.getSuccessor();
return next;
}
@Override
public void remove() {
// TODO Auto-generated method stub
}
}
答案 2 :(得分:0)
试试SList.this.head
。您试图引用您正在定义的Iterator
子类中不存在的字段。
相反,您希望引用封闭式head
类的SList
字段。这就是你可以通过使用我在开头发布的片段获得的。