Pregunta sobre iterator, java, arraylist, list – Convertir Iterador a ArrayList

206

DadoIterator<Element>, como podemos convertir esoIterator aArrayList<Element> (oList<Element>) en elmejor y mas rapido posible, para que podamos usarArrayListLas operaciones en él comoget(index), add(element), etc.

Tu respuesta

4   la respuesta
20

También puedes usarIteratorUtils de apachecolecciones comunes, aunque no admite genéricos:

List list = IteratorUtils.toList(iterator);
También tiene 2 toArray Method y 1 acepta un tipo:commons.apache.org/proper/commons-collections/javadocs/…, java.lang.Class) dwana
199

En Java 8, puedes usar el nuevoforEachRemaining método que se ha añadido a laIterator interfaz:

List<Element> list = new ArrayList<>();
iterator.forEachRemaining(list::add);
ok gracias por esa aclaración javadba
Esta debe ser la respuesta aceptada, ya que es la más corta y no depende de bibliotecas de terceros. DanielCuadra
dónde estáiterator ¿procedente de? es un simbolo sin resolver javadba
@AquariusPower El:: la sintaxis es nueva en Java 8 y se refiere a una "referencia de método", que es una forma abreviada de un lambda. Vea aquí para más información:docs.oracle.com/javase/tutorial/java/javaOO/… Stuart Marks
327

Mejor usar una biblioteca comoGuayaba:

import com.google.common.collect.Lists;

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

Otro ejemplo de guayaba:

ImmutableList.copyOf(myIterator);

oColecciones 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 devuelve la ArrayList, por ejemplo, que la guayaba es mejor que una 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
@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
De acuerdo con Renaud y Stephan. Además, si está utilizando una herramienta de compilación, es la cosa más fácil del mundo incluir estas bibliotecas ... TAMBIÉN ... si realmente no quiere incluirlas, puede ir a la fuente del código de Apache / Guava y copia lo que han hecho allí: MUCHO mejor que perder tu tiempo reinventando los cientos de ruedas hermosamente diseñadas y probadas que ya están ahí fuera. mike rodent
@CorayThan Divide y conquista a mi amigo. ¿Por qué escribir un método que ya es proporcionado por una biblioteca y se prueba? Estamos usando una gran cantidad de Apache Commons y guayaba, son increíbles y te ayudan a ahorrar tiempo y dinero. Stephan
61

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 de un iterador, te quedas atascado atravesándola 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 para el tipo:

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]

Preguntas relacionadas