Java列表迭代器似乎没有正确地进行迭代

Java列表迭代器似乎没有正确地进行迭代,java,list,iterator,listiterator,Java,List,Iterator,Listiterator,我正在写一个程序,它接受一个二叉树并按顺序遍历它。为了实现这一点,我的迭代器类遍历树并将元素添加到列表中,然后遍历列表。在调试我的代码时,我发现列表中包含了4个不同的元素,但在打印列表时,在main中,我在无限循环中反复得到tinsel(列表的第一个元素)。因此,迭代器根本不是在迭代;它在第一个元素上卡住了 迭代器类: import java.util.*; @SuppressWarnings("rawtypes") public class TreeIterator implements I

我正在写一个程序,它接受一个二叉树并按顺序遍历它。为了实现这一点,我的迭代器类遍历树并将元素添加到列表中,然后遍历列表。在调试我的代码时,我发现列表中包含了4个不同的元素,但在打印列表时,在
main
中,我在无限循环中反复得到
tinsel
(列表的第一个元素)。因此,迭代器根本不是在迭代;它在第一个元素上卡住了

迭代器类:

import java.util.*;

@SuppressWarnings("rawtypes")
public class TreeIterator implements Iterator{

    BinaryTree BT;

    TreeIterator(BinaryTree BT){
        this.BT=BT;
        inOrder(BT.root);
    }

    private List<String> decorationList = new ArrayList<String>();

    private void inOrder(Node root){
        if(root==null) return;
        inOrder(root.left);
        String temp = root.decoration;
        decorationList.add(temp);
        inOrder(root.right);
    }

    public boolean hasNext() {
        return decorationList.iterator().hasNext();
    }

    public Object next() {
        return decorationList.iterator().next();
    }

    public void remove() {
        // this method is not implemented           
    }

}
让我知道我是否也应该添加二叉树实现

public Object next() {
    //                   vvvvvvvvvvv
    return decorationList.iterator().next();
}
每次调用这些方法时,您都在创建一个新的迭代器。这就是为什么你看到了自己的行为。每次调用
hasNext
next
,都会创建一个从0开始的新迭代器

相反,如果编写的迭代器只是委托给另一个迭代器,则应在构造函数中一次性创建它:

class IteratorDelegator<T> implements Iterator<T> {
    private final Iterator<? extends T> delegate;

    IteratorDelegator(Iterable<? extends T> iterable) {
        this.delegate = iterable.iterator();
    }

    @Override
    public T next() {
        return delegate.next();
    }

    ...
}
类迭代器delegator实现迭代器{ 私有最终迭代器此
@SuppressWarnings(“rawtypes”)
是邪恶的。另外,为什么每次调用时都会再次获得
迭代器?
class IteratorDelegator<T> implements Iterator<T> {
    private final Iterator<? extends T> delegate;

    IteratorDelegator(Iterable<? extends T> iterable) {
        this.delegate = iterable.iterator();
    }

    @Override
    public T next() {
        return delegate.next();
    }

    ...
}