通常需要设置ArrayList<>
。其中一个构造函数采用集合,但没有构造函数采用迭代器。
如果我有迭代器怎么办?有没有办法“提升”到提供迭代器的集合,以便使用ArrayList<>
构造函数?
具体来说,我有PropertiesConfiguration.getKeys()
提供的迭代器,它是org.apache.commons的一部分。
答案 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
只是一个包含三种方法的接口:next
,hasNext
和{ {1}}。
获取迭代器时,使用工厂方法,该方法为您提供实现接口的某个类的实例。如果你知道具体的类,你可以查看它的文档或来源,找出是否有办法找到它迭代的集合。
但是有很多这样的课程。在remove
的情况下,查看源代码以查看您获得的迭代器类型。
编辑:
以下是Open JDK 7中ArrayList
的源代码:http://www.docjar.com/html/api/java/util/ArrayList.java.html
ArrayList
上的迭代器是私有内部类ArrayList
的一个实例。这不应该太令人惊讶。毕竟,迭代器来自工厂方法,所以你真的不应该知道你得到了什么样的迭代器。实际上,如果 能够获取此实例的类并访问其方法(例如,通过反射),那么您将做一件坏事。这个迭代器是Itr
类的(内部)实现的一部分,并且(正如@merryprankster指出的那样)将来可以改变。
答案 2 :(得分:0)
我不知道它是否可能,但在我看来,这样的函数不应该存在,因为迭代器可能不是来自集合。例如,可以创建一个链接多个集合的迭代器!