Java List Iterator似乎没有正确迭代

时间:2014-11-20 02:52:06

标签: java list iterator listiterator

我正在编写一个程序,它接受二叉树并按顺序迭代它。为此,我的迭代器类遍历树并将元素添加到列表中,然后迭代列表。在调试我的代码时,我发现该列表包含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 class Main {
    public static void main(String[] args) {

        // build a test tree
        //
        //       star
        //      /    \
        // tinsel    red balls
        //      \
        //       lights
        BinaryTree BT = new BinaryTree();
        BT.root = new Node();
        BT.root.decoration = "star";
        BT.root.left = new Node();
        BT.root.left.decoration = "tinsel";
        BT.root.left.right = new Node();
        BT.root.left.right.decoration = "lights";
        BT.root.right = new Node();
        BT.root.right.decoration = "red balls";


        TreeIterator TI = BT.createIterator();
        while(TI.hasNext()){
            System.out.println(TI.next());
        }
    }
}

如果我还要添加二叉树实现,请告诉我。

1 个答案:

答案 0 :(得分:0)

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

每次调用这些方法时,都在创建一个新的迭代器。这就是为什么你会看到你的行为。每次调用hasNextnext时,都会创建一个从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();
    }

    ...
}

另外:一般情况下我们不使用raw types。如果您的BinaryTree不是通用的,则应该实现Iterator<Object>而不是原始类型。由于decorationListList<String>,因此您应该实施Iterator<String>