我正在编写一个程序,它接受二叉树并按顺序迭代它。为此,我的迭代器类遍历树并将元素添加到列表中,然后迭代列表。在调试我的代码时,我发现该列表包含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());
}
}
}
如果我还要添加二叉树实现,请告诉我。
答案 0 :(得分:0)
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();
}
...
}
另外:一般情况下我们不使用raw types。如果您的BinaryTree
不是通用的,则应该实现Iterator<Object>
而不是原始类型。由于decorationList
是List<String>
,因此您应该实施Iterator<String>
。