从 Iterator<T> 创建 List<T> 实例

12

有人知道是否有标准方法可以从Iterator实例创建List吗?


1
你不能从Iterator创建列表,但可以创建一个List并在其元素上创建Iterator。 - Simon Dorociak
Iterator创建一个List并没有太多意义。这就像仅仅从索引创建一个数组! - adarshr
如果您的迭代器已经调用了它的“next()”函数,那么您将无法检索先前的元素。 - Colin D
@hawaii.five-0 如果您将迭代器中的每个元素添加到新列表中,则正在从迭代器创建列表... - Dave Newton
6个回答

14

5

5

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

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

while(iter.hasNext()) { // iter is of type Iterator<String>
    list.add(iter.next());
}

2
谢谢,这就是我所做的,但我希望有一些神奇的方法可以帮助我 :) - BillMan
1
如果你想要魔术方法,那就应该使用第三方库。 - Louis Wasserman
在Java 8中,你可以用iterator.forEachRemaining(list::add)来替换循环。 - shmosel

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);

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) 

1

这是我将列表转换为迭代器,反之亦然的方法。

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 + " ");

} 

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