【问题标题】:Creating custom Iterator Java?创建自定义迭代器 Java?
【发布时间】:2013-09-04 09:21:02
【问题描述】:

我对如何在 Java 中为类实现自定义迭代器感到有些困惑。我需要在不使用我已经可用的内置库的情况下创建一个 ArrayList。我了解创建类的基础知识,但我无法理解如何让迭代器适应所有这些。我有以下内容:

我创建了一个实现可迭代接口的通用类,它看起来像这样:

public class MyArrayList<T> implements Iterable<T> {

然后我必须创建一个名为 MyIterator 的类,根据文档的措辞,它是一个独立的类。这看起来相当简单,我创建了一个名为 MyIterator 的新类并让它实现了迭代器接口,所以它看起来像这样:

public class MyIterator<T> implements Iterator<T>{

我的困惑在于以下几点。该文档说迭代器需要在它自己的类中,但是我如何访问“MyArrayList”中的数据成员以完全实现 hasNext() 和 next() 例如。由于底层数组中的数据成员是私有的(它们应该是私有的),我看不到外部类如何完全实现这些方法。我误解了什么是必需的吗?通过单独的类,它仍然是“MyArrayList”类的一部分,但定义不同吗?

我希望这会有所帮助,正如我所说的,我想我理解对我的要求我只是不确定我的迭代器适合所有这些。

【问题讨论】:

  • MyArrayList#iterator() 返回new MyIterator(this) 或以某种方式传递对自身的引用,从而提供对数据的访问权限
  • MyIterator 是 MyArrayList 类的一部分,还是它通常属于它自己的一部分,这就是我感到困惑的地方,我不太清楚 Iterator 去哪里了,如果这样的话感觉。我知道 iterator() 方法应该做什么,但我不知道应该在哪里添加自定义迭代器的代码,以便它可以创建它的实例并在需要时调用 return 它。

标签: java iterator


【解决方案1】:

虽然迭代器必须是一个单独的类 *,但该类可能与您的 Iterable 类有某种关系。

它通常是一个嵌套/内部类,正是因为它需要访问该类的值(而这正是内部类的用途)。

当然,如果IterableList,您可以实现一个Iterator,根本没有任何“内部”访问权限,但您通常仍希望访问内部结构,例如检查modCount (当您在迭代 Iterable 时对它进行结构修改时抛出 ConcurrentModificationException...如果您通过 Iterator 本身修改它,则防止该异常)。

* 你可以用你的Iterable 实例本身来实现它,但是一旦用户同时使用两个迭代器,这就会破坏合同。

【讨论】:

  • 所以基本上我想要一个类似于以下的设置: public class MyArrayList implements Iterable { public class MyIterator implements Iterator { } } 编辑:抱歉,我不知道如何在 cmets 中进行代码格式化。
  • @gRnt 完全正确 - 迭代器实现可以/应该是一个私有类,因为没有人需要查看该类。 PS:将代码放在`中以将其格式化为文本。 stackoverflow.com/editing-help#comment-formatting
  • 谢谢你,我想我把“它自己的类”和不是嵌套类混淆了!
【解决方案2】:

您必须声明自己的方法hasNext()next()remove()。它必须知道如何迭代你自己的类,如何去下一个元素以及如何检查下一个元素是否存在。

【讨论】:

    猜你喜欢
    • 2018-04-14
    • 2011-08-23
    • 1970-01-01
    • 2011-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-27
    • 2014-08-26
    相关资源
    最近更新 更多