10

任何人都知道是否有从 Iterator 实例创建 List 的标准方法?

4

6 回答 6

14

我倾向于使用GuavaLists.newArrayList(Iterator),因为我通常将 Guava 作为依赖项,并且它已经存在。

于 2012-06-13T15:36:14.887 回答
5

使用Iterator获取每个元素并将其添加到List.

List<String> list = new LinkedList<String>();

while(iter.hasNext()) { // iter is of type Iterator<String>
    list.add(iter.next());
}
于 2012-06-13T15:33:43.287 回答
5

我有这个需求,作为 Apache Commons 的用户,这就是我所做的:

IteratorUtils.toList(iterator);

Javadoc在这里:https://commons.apache.org/proper/commons-collections/javadocs/api-3.2.2/org/apache/commons/collections/IteratorUtils.html#toList(java.util.Iterator)

于 2014-02-06T16:01:38.993 回答
4

在 Java 8 中,您可以使用这些方式(虽然足够详细):

Iterator<String> iterator = ...;
List<String> list = StreamSupport.stream(Spliterators.spliteratorUnknownSize(iterator, Spliterator.ORDERED), false)
                                 .collect(Collectors.toList());

或者

Iterator<String> iterator = ...;
List<String> list = new ArrayList<>(); // or LinkedList() if more relevant (adding being faster for LinkedList)
iterator.forEachRemaining(list::add);
于 2018-04-09T14:35:58.717 回答
2

尝试以下操作:

public T List<T> listFromIterator(Iterator<T> iterator) {

List<T> result = new LinkedList<T>();
  while(iterator.hasNext()) {
    result.add(iterator.next());
  }

}

需要注意的一点是,如果迭代器不在结构的开头,则无法检索先前的元素。

如果您有迭代器来自的集合,则可以使用带有集合的构造函数来创建列表。例如:LinkedList构造函数:

LinkedList(Collection<? extends E> c) 
于 2012-06-13T15:35:40.893 回答
1

这是我从 List 转换为 Iterator 的方式,反之亦然。

ArrayList arrayList = new ArrayList(); 
// add elements to the array list 
arrayList.add("C"); 
arrayList.add("A"); 
arrayList.add("E"); 
arrayList.add("B"); 
arrayList.add("D"); 
arrayList.add("F"); 

// use iterator to display contents of arrayList
System.out.print("Original contents of arrayList: "); 
Iterator iterator = arrayList.iterator(); 
ArrayList arrayList2 = new ArrayList();

while(iterator.hasNext()) {

    Object element = iterator.next(); 
    arrayList2.add(element);
    System.out.print(element + " ");

} 
于 2012-06-13T15:36:06.230 回答