[java] 반복자를 ArrayList로 변환

을 감안할 때 Iterator<Element>, 우리가 그것을 변환 할 수있는 방법 IteratorArrayList<Element>(또는 List<Element>에서) 가장 빠른 방법은 가능한, 그래서 우리가 사용할 수있는 ArrayList이 같은에들에게 ‘작업을 get(index), add(element)



답변

구아바 와 같은 라이브러리를 더 잘 사용하십시오 .

import com.google.common.collect.Lists;

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

다른 구아바 예 :

ImmutableList.copyOf(myIterator);

또는 Apache Commons 컬렉션 :

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, 다음 자바 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());


답변

IteratorUtilsApache commons-collections 에서 사용할 수도 있지만 제네릭을 지원하지는 않습니다.

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());
}