我对如何在Java中为类实现自定义迭代器感到困惑。我需要基本上创建一个ArrayList,而不使用我已经可用的内置库。我理解创建类的基础知识,但是我无法理解如何让Iterator适应所有这些。我有以下内容:
我创建了一个实现可迭代接口的泛型类,它看起来像这样:
public class MyArrayList<T> implements Iterable<T> {
然后我要创建一个名为MyIterator的类,根据该文档的措辞是一个独立的类。这看起来相当简单我创建了一个名为MyIterator的新类,并让它实现了迭代器接口,所以它看起来像这样:
public class MyIterator<T> implements Iterator<T>{
我的困惑在于以下内容。该文档说Iterator需要在它自己的类中,但是如何访问“MyArrayList”中的数据成员以完全实现hasNext()和next()。由于底层数组中的数据成员是私有的(因为它们应该是),我没有看到外部类如何完全实现这些方法。我误解了需要什么?通过单独的类它仍然是“MyArrayList”类的一部分,但定义不同?
我希望有所帮助,正如我所说,我认为我理解了我的要求,但我并不完全确定我的迭代器适用于所有这些。
答案 0 :(得分:6)
虽然迭代器必须是一个单独的类 * ,但该类可能与您的Iterable
类有一些关系。
它通常是一个嵌套/内部类,正是因为它需要访问类的值(这就是内部类的内容)。
当然,如果Iterable
是List
,您可以实现Iterator
而根本没有“内部”访问权限,但您通常仍希望能够访问内部的内容比如检查modCount
(当你在迭代它时ConcurrentModificationException
被结构修改时抛出Iterable
...如果你修改了阻止那个例外通过Iterator
本身。
*你可以用你的Iterable
实例本身来实现它,但是一旦用户同时使用两个迭代器就会破坏合同。
答案 1 :(得分:1)
您必须声明自己的方法hasNext()
,next()
,remove()
。它必须知道如何迭代你自己的类,如何转到下一个元素以及如何检查下一个元素是否存在。