迭代java.lang.Iterable的数组或实例 - 缺少常识解决方案?

时间:2014-06-23 14:57:09

标签: java iterator iterable

我正在尝试使用双向链表(称为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);

    }

}

1 个答案:

答案 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包中任何名称相同的类/接口。