Pergunta sobre java, list, iterator, arraylist – Converter Iterator para ArrayList

206

DadoIterator<Element>, como podemos converter issoIterator paraArrayList<Element> (ouList<Element>) nomelhor e mais rápido maneira possível, para que possamos usarArrayListoperações do mesmo, comoget(index), add(element)etc.

Sua resposta

4   a resposta
327

Melhor usar uma biblioteca comoGoiaba:

import com.google.common.collect.Lists;

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

Outro exemplo de goiaba:

ImmutableList.copyOf(myIterator);

ouColeções Apache Commons:

import org.apache.commons.collections.IteratorUtils;

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

List<Element> myList = IteratorUtils.toList(myIterator);       
@CorayThan menos código + métodos testados. Embora eu concorde com você, eu não adicionaria uma dependência extra apenas para usar esse método. Mas, novamente, a maioria dos meus (grandes) projetos usa o Guava ou o Apache Commons ... Renaud
Concordo com Renaud e Stephan. Além disso, se você estiver usando uma ferramenta de compilação, é a coisa mais fácil do mundo incluir essas bibliotecas ... TAMBÉM ... se você realmente não quiser incluí-las, pode ir para a origem do código Apache / Guava e copie o que eles fizeram lá: muito melhor do que desperdiçar seu tempo reinventando as centenas de rodas lindamente projetadas e testadas que já estão por aí. mike rodent
Eu não entendo. De que maneira o ArrayList é retornado por, digamos, Guava melhor do que uma ArrayList normal? Eles fazem isso de uma maneira mais eficiente? Mesmo que seja mais eficiente, vale a pena adicionar uma dependência extra (e mais complexidade) ao seu projeto? CorayThan
@CorayThan Dividir e conquistar meu amigo. Por que escrever um método que já é fornecido por uma biblioteca e é testado? Estamos usando um monte de Apache Commons e Goiaba, eles são simplesmente incríveis e ajudam você a economizar tempo e dinheiro. Stephan
20

Você também pode usarIteratorUtils do Apachecommons-coleções, embora não suporte genéricos:

List list = IteratorUtils.toList(iterator);
Ele também possui 2 métodos toArray e 1 aceita um tipo:commons.apache.org/proper/commons-collections/javadocs/…java.lang.Class) dwana
199

No Java 8, você pode usar o novoforEachRemaining método que foi adicionado aoIterator interface:

List<Element> list = new ArrayList<>();
iterator.forEachRemaining(list::add);
@javadba A questão original era sobre como converter um iterador que você já possui em uma nova ArrayList. Para fins deste exemplo, o iterador que você já tem é assumido como chamadoiterator. Stuart Marks
Onde éiterator vindo de? é um símbolo não resolvido javadba
Esta deve ser a resposta aceita, pois é a mais curta e não depende de bibliotecas de terceiros DanielCuadra
ok obrigado por esse esclarecimento javadba
61

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

Supondo que a lista contenha strings. Não existe uma maneira mais rápida de recriar uma lista a partir de um iterador, você está preso a percorrê-la manualmente e copiar cada elemento para uma nova lista do tipo apropriado.

EDITAR:

Aqui está um método genérico para copiar um iterador para uma nova lista de uma maneira segura para o 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;
}

Use assim:

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]

Perguntas relacionadas