我正在尝试使用双向链表(称为LinkedTree)实现Tree结构。话虽如此,当我使用for-each循环时,我最终得到了相同的重复错误:只能迭代数组或java.lang.Iterable的实例。我在网上查了一些类似的问题,但我似乎无法找到问题所在。我知道为了迭代器,你必须有可迭代但不是位置的实例以及children()两个可迭代的实例?我已经包含了错误的方法,我的子方法,以及我自己的iterable和iterator实现。在此先感谢您的帮助。
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);
}
}
答案 0 :(得分:3)
您只能迭代实现java.lang.Iterable
的类。但是,您尝试迭代自定义可迭代接口。那不起作用:
public interface Iterable <E> {
public Iterator<E> iterator();
public Iterable<Position<E>> positions(); // <- your custom Iterable class is returned here, NOT java.lang.Iterable
}
如果要使用可迭代类进行迭代,请扩展java.lang.Iterable
public interface Iterable <E> extends java.lang.Iterable<E>
提示:不要编写与
java.lang
包中任何名称相同的类/接口。