如何在Java中获取迭代器的集合?

时间:2011-08-07 07:15:36

标签: java iterator apache-commons

通常需要设置ArrayList<>。其中一个构造函数采用集合,但没有构造函数采用迭代器。

如果我有迭代器怎么办?有没有办法“提升”到提供迭代器的集合,以便使用ArrayList<>构造函数?
具体来说,我有PropertiesConfiguration.getKeys()提供的迭代器,它是org.apache.commons的一部分。

3 个答案:

答案 0 :(得分:11)

没有这样的事情, Iterator的{​​{1}} 。可以独立于Collection创建迭代器。它可以从任何Collection获得,或者你甚至可以创建一个实现迭代器的类。

但是,您可以通过迭代并逐个添加其元素来从Iterable获取ArrayList

Iterator

但是,请注意,对于每个可能的迭代器都无法可靠地完成此操作,因为迭代器可能会永远迭代,从而导致无限循环,很可能是Iterator<X> it = ...; List<X> list = new ArrayList<X>(); while (it.hasNext()) { list.add(it.next()); }

我建议您查看来自Google的实用程序库Google Guava。它有一个名为Lists的类,它允许您执行以下操作:

OutOfMemoryError

该库有许多方法对日常Java编码非常有用。它主要包含您想要的所有内容,但在标准Java 6 API中找不到。

答案 1 :(得分:1)

没有真正通用的方法,因为在Java中,Iterator只是一个包含三种方法的接口:nexthasNext和{ {1}}。

获取迭代器时,使用工厂方法,该方法为您提供实现接口的某个类的实例。如果你知道具体的类,你可以查看它的文档或来源,找出是否有办法找到它迭代的集合。

但是有很多这样的课程。在remove的情况下,查看源代码以查看您获得的迭代器类型。

编辑

以下是Open JDK 7中ArrayList的源代码:http://www.docjar.com/html/api/java/util/ArrayList.java.html

ArrayList上的迭代器是私有内部类ArrayList的一个实例。这不应该太令人惊讶。毕竟,迭代器来自工厂方法,所以你真的不应该知道你得到了什么样的迭代器。实际上,如果 能够获取此实例的类并访问其方法(例如,通过反射),那么您将做一件坏事。这个迭代器是Itr类的(内部)实现的一部分,并且(正如@merryprankster指出的那样)将来可以改变。

答案 2 :(得分:0)

我不知道它是否可能,但在我看来,这样的函数不应该存在,因为迭代器可能不是来自集合。例如,可以创建一个链接多个集合的迭代器!

相关问题