Dado Iterator<Element>
¿cómo podemos convertir convenientemente eso Iterator
a un List<Element>
para que podamos usar List
operaciones en él, tales como get(index)
, add(element)
etc.
Convertir iterador en lista
Maksim
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);
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
Ó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
doblaje nazar
Tenga en cuenta que hay una diferencia entre Iterable
y Iterator
.
si tienes un Iterable
luego 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());
yegor256
También puedes usar IteratorUtils
de apache colecciones comunesaunque no admite genéricos:
List list = IteratorUtils.toList(iterator);
-
También tiene 2 métodos toArray y 1 acepta un tipo:commons.apache.org/proper/commons-collections/javadocs/…java.lang.Class)
– dwana
23 de septiembre de 2015 a las 7:49
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)
);
}
-
También tiene 2 métodos toArray y 1 acepta un tipo:commons.apache.org/proper/commons-collections/javadocs/…java.lang.Class)
– dwana
23 de septiembre de 2015 a las 7:49
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