Преобразовать Iterator в ArrayList

Учитывая Iterator , как мы можем преобразовать этот Iterator в ArrayList (или List ) наилучшим и самым быстрым способом, чтобы мы могли использовать на нем операции ArrayList такие как get(index) , add(element) и т. д.

Лучше использовать библиотеку, такую ​​как Guava :

 import com.google.common.collect.Lists; Iterator myIterator = ... //some iterator List myList = Lists.newArrayList(myIterator); 

Другой пример Гуавы:

 ImmutableList.copyOf(myIterator); 

или Коллекции Apache Commons :

 import org.apache.commons.collections.IteratorUtils; Iterator myIterator = ...//some iterator List myList = IteratorUtils.toList(myIterator); 

В Java 8 вы можете использовать новый метод forEachRemaining который был добавлен в интерфейс Iterator :

 List list = new ArrayList<>(); iterator.forEachRemaining(list::add); 

Вы можете скопировать iterator в новый список следующим образом:

 Iterator iter = list.iterator(); List copy = new ArrayList(); while (iter.hasNext()) copy.add(iter.next()); 

Это предполагает, что список содержит строки. На самом деле не существует более быстрого способа воссоздать список из iteratorа, вы застреваете в нем, перебирая его вручную и копируя каждый элемент в новый список соответствующего типа.

РЕДАКТИРОВАТЬ :

Вот общий метод для копирования iteratorа в новый список безопасным способом:

 public static  List copyIterator(Iterator iter) { List copy = new ArrayList(); while (iter.hasNext()) copy.add(iter.next()); return copy; } 

Используйте его так:

 List list = Arrays.asList("1", "2", "3"); Iterator iter = list.iterator(); List copy = copyIterator(iter); System.out.println(copy); > [1, 2, 3] 

Вы также можете использовать IteratorUtils из коллекций коллекций Apache, хотя он не поддерживает дженерики:

 List list = IteratorUtils.toList(iterator); 

Обратите внимание, что существует разница между Iterable и Iterator .

Если у вас есть Iterable , то с Java 8 вы можете использовать это решение:

 Iterable iterable = createIterable(); List array = StreamSupport .stream(iterable.spliterator(), false) .collect(Collectors.toList()); 

Как я знаю, Collectors.toList() создает экземпляр ArrayList .

На самом деле, на мой взгляд, он также хорошо выглядит в одной строке.
Например, если вам нужно вернуть List из некоторого метода:

 return StreamSupport.stream(iter.spliterator(), false).collect(Collectors.toList()); 

Довольно сжатое решение с простой Java 8 с использованием java.util.stream :

 public static  ArrayList toArrayList(final Iterator iterator) { return StreamSupport .stream( Spliterators .spliteratorUnknownSize(iterator, Spliterator.ORDERED), false) .collect( Collectors.toCollection(ArrayList::new) ); } 
 List result = new ArrayList(); while (i.hasNext()){ result.add(i.next()); } 

Java 8 forEachRemaining метод в Iterator можно использовать здесь:

 List elementList = new ArrayList<>(); iterator.forEachRemaining(elementList::add); 

Попробуйте StickyList из Cactoos :

 List list = new StickyList<>(iterator); 

Отказ от ответственности: Я один из разработчиков.

используйте google guava !

 Iterable fieldsIterable = ... List fields = Lists.newArrayList(fieldsIterable); 

++

Я просто хочу указать на очевидное решение, которое НЕ будет работать:

 Список списков = Stream.generate (iterator :: следующий) 
      .collect (Collectors.toList ());

Это потому, что Stream#generate(Supplier) может создавать только бесконечные streamи, он не ожидает, что его аргумент выкинет NoSuchElementException (вот что NoSuchElementException Iterator#next() в конце).

Вместо этого следует использовать ответ xehpuk, если вы выбираете путь Iterator → Stream → List.

Здесь, в этом случае, если вам нужен самый быстрый способ, то for loop лучше.

Итератор по размеру выборки в 10,000 runs занимает 40 ms где для цикла занимает 2 ms

  ArrayList alist = new ArrayList(); long start, end; for (int i = 0; i < 1000000; i++) { alist.add(String.valueOf(i)); } ListIterator it = alist.listIterator(); start = System.currentTimeMillis(); while (it.hasNext()) { String s = it.next(); } end = System.currentTimeMillis(); System.out.println("Iterator start: " + start + ", end: " + end + ", delta: " + (end - start)); start = System.currentTimeMillis(); int ixx = 0; for (int i = 0; i < 100000; i++) { String s = alist.get(i); } System.out.println(ixx); end = System.currentTimeMillis(); System.out.println("for loop start: " + start + ", end: " + end + ", delta: " + (end - start)); 

Это предполагает, что список содержит строки.

  • Почему у вас нет «List <List >» в Java?
  • Является ли list :: size () действительно O (n)?
  • ICollection Vs List в платформе Entity Framework
  • Список против карты в Java
  • Как вы перечислите список супертипов в список подтипов?
  • Получить список различных значений в списке
  • Список привязок к DataGridView в WinForm
  • Список идентификаторов Timezone для использования с FindTimeZoneById () в C #?
  • У .NET есть способ проверить, содержит ли List a все элементы в списке b?
  • C # Список объектов, как я могу получить сумму свойства
  • В чем разница между HashSet и List ?
  • Давайте будем гением компьютера.