如何定义自己的迭代器?

3
我已经编写了自己的链表数据结构,并希望创建一个迭代器对象,以便遍历列表中的节点。
是否可以直接定义自己的迭代器,还是需要先将其转换为现有的数据结构,如LinkedList,然后在其上调用iterator()

你能展示你的数据结构定义吗?你可以创建一个名为 <MyDataType>Iterator 的新类并实现 Iterator 接口。然后,你只需实现 Iterator 接口所需的函数即可。这是接口链接:http://docs.oracle.com/javase/7/docs/api/java/util/Iterator.html - Hunter McMillen
3个回答

6
你可以通过实现Iterator接口的三个方法来定义自己的迭代器类:
boolean hasNext();
E next();
void remove();

最后一种方法是可选的:您可以实现它以仅抛出UnsupportedOperationException
最常见的策略是将实际类作为列表类的私有成员类。这样,它就可以访问您的类的私有记录数据;这通常是实现高效迭代器所必需的。
一旦您实现了迭代器类,通常有助于让列表类实现Iterable。这为客户端代码提供了一种获取迭代器的方式。

3
您可以创建一个实现 Iterator<T> 接口的类。
通常最容易在内部类中完成此操作。
然后您需要在集合类中实现 Iterable<E> 接口,并从 iterator() 方法返回您的迭代器类的新实例。
您还应该实现更高级的集合接口,例如 List<E>

0

是的,任何类都可以实现Iterable。然后,您返回另一个类(通常是内部类),该类从iterator实现Iterator

在大多数情况下,这相当简单明了。但是,如果您有具体问题,我们可以提供帮助。请注意,remove是可选的。

您还可以实现ListIterator,该迭代器专门用于列表。


我以为 Iterable 只是用于 foreach 循环。 - Hunter McMillen
@HunterMcMillen,不是的。那只是一个常见的用例,而不是唯一的用例。 - Matthew Flaschen
@HunterMcMillen - 当然,它对于那个很有用。但是它还有其他用途。 - Ted Hopp
实现 ListIterator 要复杂得多。其主要价值在于支持双向移动(以及可能的可选set方法)。如果不需要这样做,我建议坚持使用Iterable - Ted Hopp
@TedHopp,肯定更加复杂。但是它是一个列表,所以不是一个方形钉子和圆形孔的问题;这并不是那么困难。我同意他应该考虑是否值得这样做。 - Matthew Flaschen
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接