web-dev-qa-db-ja.com

イテレータをArrayListに変換します。

Iterator<Element>が与えられたら、そのIterator最善かつ最速の方法でArrayList<Element>(またはList<Element>)に変換して、get(index)add(element)などのArrayListの操作を使用することができます。等.

217
Maksim

Guava のようなライブラリを使用してください。

import com.google.common.collect.Lists;

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

もう一つのグアバの例:

ImmutableList.copyOf(myIterator);

または Apache Commons Collections

import org.Apache.commons.collections.IteratorUtils;

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

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

Java 8では、forEachRemainingインターフェースに追加された新しいIteratorメソッドを使用できます。

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

このように、イテレータを新しいリストにコピーすることができます。

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

これは、リストに文字列が含まれていることを前提としています。イテレータからリストを再作成するより速い方法は実際にはありません、あなたは手でそれを辿り、それぞれの要素を適切な型の新しいリストにコピーすることに行き詰まっています。

編集:

これは、タイプセーフな方法でイテレータを新しいリストにコピーするための一般的な方法です。

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

このように使用してください。

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

Apache のcommons-collections から IteratorUtils を使うこともできますが、そうではありません。ジェネリックスをサポートしていません。

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

IterableIterator には違いがあります。

Iterableがある場合は、Java 8ではこの解決法を使用できます。

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

私が知っているようにCollectors.toList()ArrayListインスタンスを作成します。

実は私の意見では、それはまた一行でよさそうです。
たとえば、何らかのメソッドからList<Element>を返す必要がある場合は、次のようにします。

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

Java.util.stream を使用したプレーンJava 8での非常に簡潔な解決策:

public static <T> ArrayList<T> toArrayList(final Iterator<T> iterator) {
    return StreamSupport
        .stream(
            Spliterators
                .spliteratorUnknownSize(iterator, Spliterator.ORDERED), false)
        .collect(
                Collectors.toCollection(ArrayList::new)
    );
}
7
xehpuk

IteratorのJava 8 forEachRemainingメソッドは、ここで使用できます。

List<Element> elementList = new ArrayList<>(); 
iterator.forEachRemaining(elementList::add);
6
crazy_coder
List result = new ArrayList();
while (i.hasNext()){
    result.add(i.next());
}
5
Akvel

Cactoos から StickyList を試してください。

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

免責事項:私は開発者の一人です。

1
yegor256

google guava を使用してください。

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

++

0
fedevo

私は、がうまくいかないうまくいかないように見える一見明白な解決策を指摘したいだけです:

リストlist = Stream.generate(iterator :: next)
 .collect(Collectors.toList());

それは、 Stream#generate(Supplier<T>) が無限のストリームしか作成できないからです。 NoSuchElementException (それが Iterator#next() が最後にすることです).

xehpukの答え は、イテレータ→ストリーム→リストの方法があなたの選択であれば代わりに使われるべきです。

0
Sasha