programing

반복자를 목록으로 변환

itsource 2022. 7. 28. 22:57
반응형

반복자를 목록으로 변환

정해진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);

또는 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]

와 사이에는 차이가 있습니다.

가 있는 경우 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

반응형