【问题标题】:Java Iterators - Trying to get a for each loop to workJava Iterators - 试图让每个循环工作
【发布时间】:2010-03-28 18:31:29
【问题描述】:

所以我有一个Tree<E> 类,其中E 是由树保存和组织的数据类型。我想像这样或以类似的方式遍历树:

1.  Tree<String> tree=new Tree<String>();
2.  ...add some nodes...
3.  for (String s : tree)
4.      System.out.println(s);

但它在第 3 行给了我一个错误。

Incompatible types
    required: java.lang.String
    found:    java.lang.Object    

然而,以下工作正常且符合预期,对树执行适当的按顺序遍历并按应有的方式打印每个节点:

for (TreeIterator<String> i = tree.iterator(); i.hasNext(); )
    System.out.println(i.next());


我的 Tree 类如下所示:

public class Tree<E> implements java.lang.Iterable{
    ...
    public TreeIterator<E> iterator(){
        return new TreeIterator<E>(root);//return an iterator for the root node
    }
    ....
}


我的 TreeIterator 类看起来像这样:

public class TreeIterator<E> implements java.util.Iterator<E>{
    public E next(){
        ...
    }
    ...
}

但我想让for (String s : tree) 循环正常工作 - 有什么想法吗?这样做的重点是为我的程序设置一个干净的 foreach 循环,而不是使用那个丑陋的 for 循环。

知道我做错了什么吗?


编辑

根据best answer(以及不久之后发布的another equally good answer),以下使其工作:

变化

public class Tree<E> implements java.lang.Iterable{
    ....
}

public class Tree<E> implements java.lang.Iterable<E>{
    ....
}

...谢谢大家!

【问题讨论】:

  • 您的错误是您的迭代器返回 Object 而不是 String
  • 注意:我添加了一些额外的代码。另外,@Jordan:我的迭代器是指 next() 函数吗?现在,当我尝试将 next() 从返回 E 更改为返回 Object 时,它给了我一个错误并说要改回来。

标签: java iterator foreach


【解决方案1】:

如果您的 Tree&lt;E&gt; 类也实现了 Iterable&lt;E&gt; 接口,那么 foreach 循环应该可以正常工作。您需要确保您的迭代器也返回泛型类型E

【讨论】:

  • 哦-对!这是有道理的,这就是为什么它要求Object;因为现在我的Tree&lt;E&gt; 类基本上是在实现Iterable&lt;Object&gt;
【解决方案2】:

你的Tree 必须实现Iterable&lt;E&gt;,如果你希望它以通用方式与for each 循环一起工作(因此你的iterator() 方法必须返回Iterator&lt;E&gt;

【讨论】:

    【解决方案3】:

    您粘贴的代码中的 for 循环:

    3。 for (String s : 树)

    错误地将树 dataStructure 的元素类型转换为字符串的集合(或数组)。

    我怀疑它应该看起来像:

    for (String s : tree.getNodes()){...}
    

    getNodes 返回一个字符串集合。

    在您粘贴更多代码之前,不能肯定地说。

    【讨论】:

    • 否,每次调用 next() 时,迭代器只返回一个字符串(或 E 恰好是什么)。不过谢谢!
    猜你喜欢
    • 2023-03-10
    • 2013-10-30
    • 1970-01-01
    • 1970-01-01
    • 2012-11-11
    • 2021-08-21
    • 1970-01-01
    • 1970-01-01
    • 2021-08-17
    相关资源
    最近更新 更多