が与えられた場合、 、などの の操作を使用できるように、それをIterator<Element>
に便利に変換するにはどうすればよいでしょうか。Iterator
List<Element>
List
get(index)
add(element)
12 に答える
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);
Java 8 では、インターフェースforEachRemaining
に追加された新しいメソッドを使用できます。Iterator
List<Element> list = new ArrayList<>();
iterator.forEachRemaining(list::add);
次のように、イテレータを新しいリストにコピーできます。
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]
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());
ジェネリックスをサポートしていませんが、Apachecommons-collectionsIteratorUtils
から使用することもできます。
List list = IteratorUtils.toList(iterator);
以下を使用したプレーンな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)
);
}
List result = new ArrayList();
while (i.hasNext()){
result.add(i.next());
}
グーグルグアバを使用してください!
Iterable<String> fieldsIterable = ...
List<String> fields = Lists.newArrayList(fieldsIterable);
++
この場合、可能な限り最速の方法が必要な場合for loop
は、より良い方法です。
for ループがかかる10,000 runs
テイクのサンプル サイズに対するイテレータ40 ms
2 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));
これは、リストに文字列が含まれていることを前提としています。