반복자를 목록으로 변환
정해진Iterator<Element>
어떻게 하면 쉽게 변환할 수 있을까요?Iterator
에 대해서List<Element>
를 사용할 수 있습니다.List
님의 업무는 다음과 같습니다.get(index)
,add(element)
,기타.
Guava와 같은 라이브러리를 사용하는 것이 좋습니다.
import com.google.common.collect.Lists;
Iterator<Element> myIterator = ... //some iterator
List<Element> myList = Lists.newArrayList(myIterator);
또 다른 Guava의 예:
ImmutableList.copyOf(myIterator);
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]
와 사이에는 차이가 있습니다.
가 있는 경우 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());
Apache commons-collections에서도 사용할 수 있지만 제네릭은 지원하지 않습니다.
List list = IteratorUtils.toList(iterator);
플레인 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)
);
}
외부 의존 없이 Streams 및 Java 16 toList()를 사용하는 원라이너입니다.
소정의 경우Iterator<?> iterator
:
List<?> list = StreamSupport.stream(Spliterators.spliteratorUnknownSize(iterator, 0), false).toList();
List result = new ArrayList();
while (i.hasNext()){
result.add(i.next());
}
효과가 없을 것 같은 명백한 해결책을 지적하고 싶을 뿐입니다.
목록 = Stream.generate(반복자: next).collectors.toList();
왜냐하면 무한 스트림만 생성할 수 있기 때문에 인수가 (결국 그렇게 될) 것으로 예상하지 않기 때문입니다.
Iterator→Stream→List 방식을 선택한 경우 대신 xehpuk의 답변을 사용해야 합니다.
선인장 체험:
List<String> list = new StickyList<>(iterable);
면책사항:저는 개발자 중 한 명입니다.
구글 guava를 사용하세요!
Iterable<String> fieldsIterable = ...
List<String> fields = Lists.newArrayList(fieldsIterable);
++
이 경우 가능한 한 빠른 방법을 원할 경우for loop
더 좋아요.
샘플 크기를 초과하는 반복기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));
목록에 문자열이 포함되어 있다고 가정합니다.
언급URL : https://stackoverflow.com/questions/10117026/convert-iterator-to-list
'programing' 카테고리의 다른 글
이중성(예: Double Star(예:NSERror **? (0) | 2022.07.28 |
---|---|
Vue JS의 확인란에 대한 적절한 양방향 바인딩 (0) | 2022.07.28 |
Java에서 파일로 바이트 [] (0) | 2022.07.28 |
malloc을 사용할 때마다 경고가 뜨는 이유는 무엇입니까? (0) | 2022.07.28 |
다른 vuex 모듈에서 getter에 액세스하는 방법 (0) | 2022.07.28 |