Convertir iterador en lista

5 minutos de lectura

avatar de usuario
Maksim

Dado Iterator<Element>¿cómo podemos convertir convenientemente eso Iterator a un List<Element>para que podamos usar Listoperaciones en él, tales como get(index), add(element)etc.

avatar de usuario
Renaud

Mejor usa una biblioteca como Guayaba:

import com.google.common.collect.Lists;

Iterator<Element> myIterator = ... //some iterator
List<Element> myList = Lists.newArrayList(myIterator);

Otro ejemplo de guayaba:

ImmutableList.copyOf(myIterator);

o Colecciones Apache Commons:

import org.apache.commons.collections.IteratorUtils;

Iterator<Element> myIterator = ...//some iterator

List<Element> myList = IteratorUtils.toList(myIterator);       

  • no lo entiendo ¿De qué manera el ArrayList devuelto por, digamos, Guava es mejor que un ArrayList normal? ¿Lo hacen de una manera más eficiente? Incluso si es más eficiente, ¿realmente vale la pena agregar una dependencia adicional (y más complejidad) a su proyecto?

    – CorayThan

    24 de febrero de 2013 a las 23:16

  • @CorayThan menos código + métodos probados. Aunque estoy de acuerdo con usted, no agregaría una dependencia adicional solo para usar ese método. Pero, de nuevo, la mayoría de mis (grandes) proyectos usan Guava o Apache Commons…

    – Renaud

    25 de febrero de 2013 a las 22:31

  • @CorayThan Divide y conquista a mi amigo. ¿Por qué escribir un método que ya proporciona una biblioteca y está probado? Estamos usando mucho Apache Commons y Guava, son increíbles y te ayudan a ahorrar tiempo y dinero.

    – Stephan

    3 de noviembre de 2015 a las 14:20

  • De acuerdo con Renaud y Stephan. Además, si está utilizando una herramienta de compilación, es lo más fácil del mundo incluir estas bibliotecas… TAMBIÉN… si realmente no quiere incluirlas, puede ir a la fuente del código Apache/Guava y Copie lo que han hecho allí: MUCHO mejor que perder el tiempo reinventando los cientos de ruedas bellamente diseñadas y probadas que ya existen.

    – mike roedor

    2 de marzo de 2018 a las 9:50

En Java 8, puede usar el nuevo forEachRemaining método que se ha agregado al Iterator interfaz:

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

  • Que significa ::? que nombre tiene parece una referencia directa a list.add(); y parece también algo nuevo de java8; ¡y gracias! 🙂

    – Poder de Acuario

    02/03/2015 a las 22:15


  • @AquariusPower El :: La sintaxis es nueva en Java 8 y hace referencia a una “referencia de método”, que es una forma abreviada de lambda. Ver aquí para más información: docs.oracle.com/javase/tutorial/java/javaOO/…

    – Marcas de Stuart

    3 de marzo de 2015 a las 1:27


  • dónde está iterator ¿procedente de? es un símbolo sin resolver

    – Proyectos de la costa oeste

    23 de abril de 2018 a las 3:34


  • @javadba La pregunta original era sobre cómo convertir un iterador que ya tiene en una nueva ArrayList. Para los fines de este ejemplo, se supone que el iterador que ya tiene se llama iterator.

    – Marcas de Stuart

    23 de abril de 2018 a las 17:46

  • Esta debería ser la respuesta aceptada, ya que es la más corta y no depende de bibliotecas de terceros.

    – Daniel Cuadra

    26 de junio de 2018 a las 17:40

avatar de usuario
Óscar López

Puede copiar un iterador a una nueva lista como esta:

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

Eso suponiendo que la lista contiene cadenas. Realmente no hay una forma más rápida de recrear una lista a partir de un iterador, está atascado recorriéndolo a mano y copiando cada elemento en una nueva lista del tipo apropiado.

EDITAR :

Aquí hay un método genérico para copiar un iterador a una nueva lista de una manera segura:

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

Úsalo así:

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

  • no lo haría Iterator<? extends T> it ser más flexible en la declaración de su método?

    –Ravindra Ranwala

    17 de febrero a las 3:14

avatar de usuario
doblaje nazar

Tenga en cuenta que hay una diferencia entre Iterable y Iterator.

si tienes un Iterableluego con Java 8 puede usar esta solución:

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

Que yo sé Collectors.toList() crea ArrayList instancia.

En realidad, en mi opinión, también se ve bien en una línea.
Por ejemplo, si necesita regresar List<Element> de algún método:

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

avatar de usuario
yegor256

También puedes usar IteratorUtils de apache colecciones comunesaunque no admite genéricos:

List list = IteratorUtils.toList(iterator);

avatar de usuario
ratón mágico

Solución bastante concisa con Java 8 simple usando java.util.stream:

public static <T> ArrayList<T> toArrayList(final Iterator<T> iterator) {
    return StreamSupport
        .stream(
            Spliterators
                .spliteratorUnknownSize(iterator, Spliterator.ORDERED), false)
        .collect(
                Collectors.toCollection(ArrayList::new)
    );
}

Sin dependencia externaaquí hay una línea usando Streams y java 16 toList().

Dado un Iterator<?> iterator:

List<?> list = StreamSupport.stream(Spliterators.spliteratorUnknownSize(iterator, 0), false).toList();

  • uno puede establecer paralelo a ‘verdadero’ para hacer la lista más rápida.

    – mati

    10 ene a las 10:46

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad