【问题标题】:Iterate over array or instance of java.lang.Iterable - Missing common sense solution?迭代 java.lang.Iterable 的数组或实例 - 缺少常识解决方案?
【发布时间】: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 迭代器实现深度优先搜索或突破优先搜索算法。

标签: java iterator iterable


【解决方案1】:

您只能迭代实现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 包中的任何内容同名的类/接口。

【讨论】:

  • 我理解你所说的扩展 java.lang.Iterable 但对于这个任务我不能。我必须自己实现一切。这就是我遇到问题的地方。同样,所有接口都必须具有相同的名称,例如迭代器、可迭代等。
  • 我将 for-each 循环转换为 while 循环。该代码作为对原始问题的编辑发布。
猜你喜欢
  • 2014-05-23
  • 2015-12-04
  • 2022-12-08
  • 2020-07-26
  • 2013-07-22
  • 1970-01-01
  • 1970-01-01
  • 2016-03-19
  • 1970-01-01
相关资源
最近更新 更多