을 감안할 때 Iterator<Element>
, 우리가 그것을 변환 할 수있는 방법 Iterator
에 ArrayList<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());
답변
IteratorUtils
Apache 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());
}