264

が与えられた場合、 、などの の操作を使用できるように、それをIterator<Element>に便利に変換するにはどうすればよいでしょうか。IteratorList<Element>Listget(index)add(element)

4

12 に答える 12

383

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);       
于 2012-06-11T06:34:08.740 に答える
268

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

List<Element> list = new ArrayList<>();
iterator.forEachRemaining(list::add);
于 2015-02-13T02:54:08.893 に答える
69

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

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]
于 2012-04-12T03:36:03.360 に答える
29

Iterableと の間には違いがあることに注意してくださいIterator

がある場合はIterable、Java 8 で次のソリューションを使用できます。

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

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

実際、私の意見では、1行でも見栄えがします。
たとえばList<Element>、あるメソッドから戻る必要がある場合:

return StreamSupport.stream(iter.spliterator(), false).collect(Collectors.toList());
于 2016-12-29T18:44:04.580 に答える
24

ジェネリックスをサポートしていませんが、Apachecommons-collectionsIteratorUtilsから使用することもできます。

List list = IteratorUtils.toList(iterator);
于 2013-03-20T06:59:39.203 に答える
10

以下を使用したプレーンなJava 8を使用した非常に簡潔なソリューション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)
    );
}
于 2014-06-02T15:15:00.583 に答える
5
List result = new ArrayList();
while (i.hasNext()){
    result.add(i.next());
}
于 2012-04-12T03:36:53.247 に答える
0

グーグルグアバを使用してください!

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

++

于 2012-10-08T17:11:23.787 に答える
-2

この場合、可能な限り最速の方法が必要な場合for loopは、より良い方法です。

for ループがかかる10,000 runsテイクのサンプル サイズに対するイテレータ40 ms2 ms

        ArrayList<String> alist = new ArrayList<String>();  
        long start, end;  

        for (int i = 0; i < 1000000; i++) {  
            alist.add(String.valueOf(i));  
        }  

        ListIterator<String> it = alist.listIterator();      

        start = System.currentTimeMillis();  
        while (it.hasNext()) {  
            String s = it.next();  
        }  
        end = System.currentTimeMillis();  

        System.out.println("Iterator start: " + start + ", end: " + end + ", delta: "  
            + (end - start));  
        start = System.currentTimeMillis();  
        int ixx = 0;  
        for (int i = 0; i < 100000; i++) {  
            String s = alist.get(i);  
        }  

        System.out.println(ixx);  
        end = System.currentTimeMillis();  
        System.out.println("for loop start: " + start + ", end: " + end + ", delta: "  
            + (end - start));  

これは、リストに文字列が含まれていることを前提としています。

于 2012-04-12T03:48:44.307 に答える