it-swarm.com.de

Konvertieren Sie Iterator in ArrayList

Wie können wir angesichts von Iterator<Element>Iterator in ArrayList<Element> (oder List<Element>) auf die beste und schnellste-Weise umwandeln, damit wir die Operationen von ArrayList wie get(index), add(element) usw. verwenden können, usw.

205
Maksim

Verwenden Sie besser eine Bibliothek wie Guava :

import com.google.common.collect.Lists;

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

Ein anderes Guava-Beispiel:

ImmutableList.copyOf(myIterator);

oder Apache Commons-Sammlungen :

import org.Apache.commons.collections.IteratorUtils;

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

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

In Java 8 können Sie die neue forEachRemaining-Methode verwenden, die der Iterator-Schnittstelle hinzugefügt wurde:

List<Element> list = new ArrayList<>();
iterator.forEachRemaining(list::add);
197
Stuart Marks

Sie können einen Iterator wie folgt in eine neue Liste kopieren:

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

Dies setzt voraus, dass die Liste Zeichenfolgen enthält. Es gibt wirklich keinen schnelleren Weg, um eine Liste von einem Iterator neu zu erstellen. Sie müssen nicht mehr mit der Hand gehen und jedes Element in eine neue Liste des entsprechenden Typs kopieren.

BEARBEITEN:

Hier ist eine generische Methode, um einen Iterator typsicher in eine neue Liste zu kopieren:

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

Verwenden Sie es so:

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]
61
Óscar López

Sie können auch IteratorUtils aus Apache commons-collection verwenden, obwohl es keine Generics unterstützt:

List list = IteratorUtils.toList(iterator);
20
yegor256

Beachten Sie, dass es einen Unterschied zwischen Iterable und Iterator gibt.

Wenn Sie eine Iterable haben, können Sie mit Java 8 diese Lösung verwenden:

Iterable<Element> iterable = createIterable();
List<Element> array = StreamSupport
    .stream(iterable.spliterator(), false)
    .collect(Collectors.toList());

Wie ich weiß, erstellt Collectors.toList() eine ArrayList-Instanz.

Eigentlich sieht es meiner Meinung nach auch in einer Zeile gut aus.
Zum Beispiel, wenn Sie List<Element> von einer Methode zurückgeben müssen:

return StreamSupport.stream(iter.spliterator(), false).collect(Collectors.toList());
15
Dub Nazar

Ziemlich prägnante Lösung mit einfachem Java 8 unter Verwendung von 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)
    );
}
6
xehpuk
List result = new ArrayList();
while (i.hasNext()){
    result.add(i.next());
}
5
Akvel

Die Java 8 forEachRemaining-Methode in Iterator kann hier verwendet werden:

List<Element> elementList = new ArrayList<>(); 
iterator.forEachRemaining(elementList::add);
4
crazy_coder

Versuchen Sie StickyList from Cactoos :

List<String> list = new StickyList<>(iterator);

Haftungsausschluss: Ich bin einer der Entwickler.

1
yegor256

benutze google guava !

Iterable<String> fieldsIterable = ...
List<String> fields = Lists.newArrayList(fieldsIterable);

++

0
fedevo

Ich möchte nur auf eine scheinbar offensichtliche Lösung hinweisen, die NICHT funktioniert:

List list = Stream.generate (Iterator :: next) 
 .collect (Collectors.toList ());

Das liegt daran, dass Stream#generate(Supplier<T>) nur unendliche Streams erstellen kann. Es wird nicht erwartet, dass sein Argument NoSuchElementException auslöst (das ist es, was Iterator#next() am Ende tut).

Die Antwort des xehpuk sollte stattdessen verwendet werden, wenn der Iterator → Stream → List-Weg Ihre Wahl ist.

0
Sasha