有麻烦为我自己的列表创建一个迭代器

时间:2013-11-23 14:23:54

标签: java iterator

我的列表如下所示:

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。我想知道为什么这不起作用,因为我在同一个班级。

3 个答案:

答案 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字段。这就是你可以通过使用我在开头发布的片段获得的。