É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.
Réponses
Trop de publicités?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);
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]
Vous pouvez également utiliser IteratorUtils
d'Apache commons-collections , bien qu'il ne supporte pas les génériques:
List list = IteratorUtils.toList(iterator);
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));
}