286 votes

Convertir l'itérateur en ArrayList

Étant donné Iterator<Element> , comment pouvons-nous convertir cet itérateur en ArrayList<Element> (ou List<Element> ) de la meilleure façon possible pour que nous puissions utiliser les opérations de ArrayList telles que get (index), add (élément), etc.

400voto

Renaud Points 3226

Mieux vaut utiliser une bibliothèque comme Guava :

 import com.google.common.collect.Lists;

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

ou Apache Commons Collections :

 import org.apache.commons.collections.IteratorUtils;

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

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

73voto

Óscar López Points 97105

Vous pouvez copier un itérateur à une nouvelle liste comme ceci:

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

C'est en supposant que la liste contient des chaînes de caractères. Il n'y a vraiment pas un moyen plus rapide pour recréer une liste à partir d'un itérateur, vous êtes coincé avec le traverser par la main et la copie de chaque élément d'une liste du type approprié.

EDIT :

Voici une méthode générique pour la copie d'un itérateur à une nouvelle liste dans un type de façon sécuritaire:

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

L'utiliser comme ceci:

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]

24voto

yegor256 Points 21737

Vous pouvez également utiliser IteratorUtils d'Apache commons-collections , bien qu'il ne supporte pas les génériques:

 List list = IteratorUtils.toList(iterator);
 

10voto

xehpuk Points 645

Solution assez concise avec Java 8 standard utilisant 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));
}
 

6voto

Akvel Points 341
List result = new ArrayList();
while (i.hasNext()){
    result.add(i.next());
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X