programing

Java에서 반복 가능한 크기 가져오기

nicegoodjob 2023. 1. 16. 20:15
반응형

Java에서 반복 가능한 크기 가져오기

나는 내 원소의 수를 알아내야 한다.Iterable자바어.내가 할 수 있다는 거 알아

Iterable values = ...
it = values.iterator();
while (it.hasNext()) {
  it.next();
  sum++;
}

더 이상 Itable의 객체가 필요 없기 때문에 다음과 같은 작업을 수행할 수도 있습니다.

it = values.iterator();
while (it.hasNext()) {
  it.remove();
  sum++;
}

소규모 벤치마크에서는 성능 차이가 크지 않았습니다. 이 문제에 대한 의견이나 다른 아이디어는 없습니까?

TL;DR: Great Guava 라이브러리의 유틸리티 방법을 사용합니다.

두 개의 코드 스니펫 중 첫 번째 코드 스니펫을 사용해야 합니다.두 번째 코드 스니펫은 모든 요소를 제거할 것이기 때문입니다.values그 후는 비어 있습니다.단순한 쿼리의 데이터 구조를 크기와 같이 변경하는 것은 매우 예상치 못한 일입니다.

성능의 경우 이는 데이터 구조에 따라 달라집니다.예를 들어, 실제로,ArrayList(두 번째 방법으로 실행 중인) 요소의 첫 번째 삭제는 매우 느립니다(사이즈 계산은 원래대로 O(n)가 아니라 O(n*n)가 됩니다.

일반적으로, 만약의 기회가 있다면values실제로는Collection뿐만 아니라Iterable, 이것을 체크하고, 콜합니다.size()다음과 같은 경우:

if (values instanceof Collection<?>) {
  return ((Collection<?>)values).size();
}
// use Iterator here...

문의처size()보통 요소의 수를 세는 것보다 훨씬 빠릅니다.그리고 이 트릭이 바로 Guava가 당신에게 하는 일입니다.

Java 8을 사용하는 경우 다음을 사용할 수 있습니다.

Iterable values = ...
long size = values.spliterator().getExactSizeIfKnown();

반복 가능한 소스의 크기가 정해진 경우에만 작동합니다.대부분의 수집용 스플리테이터는 사용할 수 있지만, 이 스플리테이터의 경우 문제가 발생할 수 있습니다.HashSet또는ResultSet예를 들어.

javadoc은 여기서 확인할 수 있습니다.

Java 8이 옵션이 아니거나 반복 가능한 항목이 어디서 왔는지 모를 경우 guava와 동일한 방법을 사용할 수 있습니다.

  if (iterable instanceof Collection) {
        return ((Collection<?>) iterable).size();
    } else {
        int count = 0;
        Iterator iterator = iterable.iterator();
        while(iterator.hasNext()) {
            iterator.next();
            count++;
        }
        return count;
    }

조금 늦었지만 누군가에게 도움이 될 수도 있습니다.비슷한 문제에 직면하다Iterable제 코드베이스와 솔루션은for each명시적으로 전화하지 않고values.iterator();.

int size = 0;
for(T value : values) {
   size++;
}

목록에 반복 가능한 항목을 지정한 후 .size()를 사용할 수 있습니다.

Lists.newArrayList(iterable).size();

알기 쉽게 하기 위해 위의 방법에서는 다음과 같은 Import가 필요합니다.

import com.google.common.collect.Lists;

엄밀히 말하면, Itable은 사이즈가 없습니다.데이터 구조를 사이클처럼 생각하십시오.

그리고 크기 제한 없이 반복 가능한 예를 따르는 것을 생각해 보십시오.

    new Iterable(){

        @Override public Iterator iterator() {
            return new Iterator(){

                @Override
                public boolean hasNext() {
                    return isExternalSystemAvailble();
                }

                @Override
                public Object next() {
                    return fetchDataFromExternalSystem();
                }};
        }};

Java 8 이상

StreamSupport.stream(data.spliterator(), false).count();

나는 찬성할 것이다.it.next()라는 단순한 이유로next()구현이 보증되지만,remove()는 옵션 조작입니다.

E next()

반복의 다음 요소를 반환합니다.

void remove()

기본 컬렉션에서 반복기에서 마지막으로 반환된 요소를 삭제합니다(옵션 작업).

나로서는, 이것들은 단지 다른 방법일 뿐이다.첫 번째 항목은 반복 중인 개체를 변경하지 않고 그대로 유지하며, 두 번째 항목은 비어 있습니다.문제는 당신이 무엇을 하고 싶은가이다.삭제 작업은 반복 가능한 개체의 구현에 따라 복잡해집니다.Collections를 사용하는 경우 - Kazekage Gaara가 제안한 것과 같은 크기만 구입하면 됩니다. - 일반적으로 최고의 접근 방식 성능을 발휘합니다.

왜 그냥 그냥...size() your 서 method on on のCollection소의수 수를 ??? ???

Iterator그냥 반복하는 거지 다른 건 없어

루프를 사용하여 각 요소를 카운트하거나 서드파티 라이브러리를 사용하는 대신 ArrayList에서 반복 가능한 것을 타이프캐스트하여 크기를 얻을 수 있습니다.

((ArrayList) iterable).size();

언급URL : https://stackoverflow.com/questions/11598977/get-size-of-an-iterable-in-java

반응형