【问题标题】:JAVA - creating an Iterator for tree data structure, that implements iterator, and gets Head nodeJAVA - 为树数据结构创建一个迭代器,实现迭代器,并获取头节点
【发布时间】:2016-08-09 23:29:16
【问题描述】:

我正在实现一棵二叉树。我为实现迭代器的树创建了一个迭代器类,但我必须为构造函数提供树:

    public class AvlIterator implements Iterable<Integer>{
    public Iterator<Integer> iterator(AvlTree avlTree){
    //here i construct the iterator class, with the avlTree inside.
    }
}

但是接口在它的构造函数中没有得到任何对象。它告诉我添加这个签名:

    public Iterator<Integer> iterator();

那么我的实现有什么问题?一方面我需要树对象来执行我的操作,另一方面 Java 正在“告诉我”我没有正确地做事。

【问题讨论】:

    标签: java data-structures iterator


    【解决方案1】:

    要回答您的问题“我的实现有什么问题”,Iterable&lt;T&gt; 接口有一种称为Iterator&lt;T&gt; iterator() 的方法,它必须由实现该接口的类实现。如果您看到方法签名,它不需要任何参数。所以,当你实现一个带有参数的方法时,你实际上并没有重写这个方法,而是添加了另一个重载的方法。因此,编译器抱怨您必须实现该方法。

    这就是为什么总是建议使用 @Override 注释您“认为”您正在覆盖的任何方法。如果方法签名与您尝试覆盖的方法不匹配,这将捕获。

    例如,许多人可能会错误地使用他们要覆盖的类型覆盖equals 方法,而不是Object,这实际上是不覆盖的。如果没有@Override,一切都可以编译,但如果在 Collection 框架中使用该类型的对象,甚至在使用 equals 方法时,它可能会产生奇怪的错误。

    public boolean equals(Employee employee) {
        //amazing logic to find equality
    }
    

    是一个错误的实现,可以在没有@Override注解的情况下转义编译器。

    【讨论】:

      【解决方案2】:

      如果您将AvlIterator 设置为AvlTree 类的内部类,它将可以访问AvlTree 实例,并且您不必向iterator() 方法传递任何内容。这样就可以实现Iterable接口所需要的方法了。

      实际上,如果AvlTree 本身实现Iterable&lt;Integer&gt; 会更有意义。 AvlIterator 将实现 Iterator&lt;Integer&gt;

      public class AvlTree implements Iterable<Integer>
      {
      
          ...
          class AvlIterator implements Iterator<Integer>
          {
              ... here you have access to the properties of the enclosing AvlTree instance ...
          }
          ...
      
          public Iterator<Integer> iterator()
          {
              return new AvlIterator ();
          }
          ...
      
      }
      

      【讨论】:

      • 或者更好地在方法 iterator() 中使用匿名类,它扩展了 Iterator 并返回它。并且 AvlTree 必须扩展 Iterable
      • 这就是大多数迭代器在 JVM 中的实现方式,因此它可能是正确的方法。
      • @ArnaudDenoyelle - 你是说匿名类是首选方法还是内部类是首选方法?
      • 非常感谢!这真的是我需要的。
      • @user3493289 内部类。你的提议也是实现这个内部类的一种干净的方式。
      猜你喜欢
      • 2011-08-23
      • 2016-07-24
      • 1970-01-01
      • 2021-10-15
      • 2010-10-09
      • 2014-12-26
      • 1970-01-01
      • 2011-04-23
      • 2018-05-20
      相关资源
      最近更新 更多