【发布时间】:2014-08-13 16:19:37
【问题描述】:
我正在尝试使用双向链表(称为 LinkedTree)来实现树结构。话虽如此,当使用我的 for-each 循环时,我最终会得到相同的重复错误:只能迭代数组或 java.lang.Iterable 的实例。我在网上查了一些类似的问题,但我似乎无法找到问题所在。我知道为了迭代,你必须有可迭代的实例,但位置和 children() 不是两个可迭代的实例吗?我已经将这两种方法都包含在错误中,我的 children 方法以及我自己的可迭代和迭代器实现。提前感谢您的帮助。
public Iterator<E> iterator() {
Iterable<Position<E>> positions = positions();
PositionalList<E> elements = new NodePositionalList<E>();
for (Position<E> p: positions) // ERROR @ positions
elements.addLast(p.element());
return elements.iterator();
}
private void preOrderPositions(Position<E> v, PositionalList<Position<E>> pos)
throws InvalidPositionException {
pos.addLast(v);
for (Position<E> w : children(v)) //ERROR @ children (v)
preOrderPositions(w, pos);
}
儿童法
public Iterable<Position<E>> children(Position<E> v)
throws InvalidPositionException {
TreePosition <E> p = checkPosition(v);
if (isExternal(v))
throw new InvalidPositionException("");
return p.getChildren();
迭代器
public interface Iterator<E> {
public boolean hasNext();
public E next();
public void remove();
}
可迭代
public interface Iterable <E> {
public Iterator<E> iterator();
public Iterable<Position<E>> positions();
}
ElementIterator(我的迭代器实现)
public class ElementIterator<E> implements Iterator <E> {
private PositionalList <E> list;
private Position <E> cursor;
public ElementIterator (PositionalList <E> L){
list = L;
cursor = (list.isEmpty())? null: list.first();
}
public boolean hasNext() {
return (cursor != null);
}
public E next(){
E toReturn = cursor.element();
cursor = (cursor == list.last())? null: list.next(cursor);
return toReturn;
}
public void remove(){
throw new UnsupportedOperationException();
}
}
编辑:我将 for-each 循环转换为 while 循环,如下所示....
protected void preOrderPositions(Position<E> v,
PositionalList<Position<E>> pos) throws InvalidPositionException {
pos.addLast(v);
Iterator<Position<E>> iter = children(v).iterator();
while (iter.hasNext()) {
Position<E> w = iter.next();
preOrderPositions(w, pos);
}
}
【问题讨论】:
-
如果我猜对了,您希望有一个 Interator 循环遍历所有树元素。如果是,则必须为 one 迭代器实现深度优先搜索或突破优先搜索算法。