Iterator를 사용할 때 현재 루프 인덱스를 얻는 방법은 무엇입니까?


108

Iterator를 사용하여 컬렉션을 반복하고 현재 요소의 인덱스를 가져오고 싶습니다.

어떻게 할 수 있습니까?



1
@finnw 나는 그들이 중복이라고 생각하지 않습니다. 이 질문은 Iterator를 사용하여 묻는 것이고 다른 하나는 for-each 루프를 사용하는 것입니다. 두 질문 모두 유사한 접근 방식으로 해결되므로 질문이 아니라 답변이 중복됩니다.
로버트

답변:


92

자신의 변수를 사용하고 루프에서 증가시킵니다.


6
그러나에 대한 @ mateusz-dymczyk 제안도 참조하십시오 it.nextIndex(). 컬렉션이 목록 일 때 유용합니다.
noamtm

113

나는 같은 질문이 있었고 ListIterator를 사용하여 효과가 있음을 알았습니다. 위의 테스트와 유사합니다.

List<String> list = Arrays.asList("zero", "one", "two");

ListIterator iter = list.listIterator();

while (iter.hasNext()) {
    System.out.println("index: " + iter.nextIndex() + " value: " + iter.next());
}

실제로 next ()를 얻기 전에 nextIndex를 호출했는지 확인하십시오.


5
') 실제로 (다음을하기 전에 당신이은, nextIndex 전화 확인'언급 주셔서 감사합니다
강가 다르 잔누

고마워, 나는 이것에 대해 전에 몰랐다. 주의해야 할 점은 ListIterator는 양방향이지만 Iterator는 단방향이라는 것입니다. 효과적으로 커서를 앞뒤로 이동하지 않는 한 안전해야합니다.
user2910265

28

자체 변수를 사용하고 간결하게 유지하는 방법은 다음과 같습니다.

List<String> list = Arrays.asList("zero", "one", "two");

int i = 0;
for (Iterator<String> it = list.iterator(); it.hasNext(); i++) {
    String s = it.next();
    System.out.println(i + ": " + s);
}

출력 (당신이 추측) :

0: zero
1: one
2: two

장점은 루프 내에서 인덱스를 증가시키지 않는다는 것입니다 (반복 당 한 번만 Iterator # next를 호출하도록주의해야하지만 맨 위에서 만 수행).


3
반복기를 직접 생성하는 경우 ListIterator도 사용할 수 있으며 별도의 int 변수가 필요하지 않습니다.
로버트 Klemme

1
당신이 Arrays.asList에 대한 '고정 수입'을 사용하는 경우, 당신은 쓸 수 있습니다asList("zero", "one", "two")
karmakaze

이것이 바울의 대답을 읽기 전에 내가 한 방식입니다. 나는 그것에 대해 어떤 이점도 보지 못하기 때문에 당신의 방식을 강력히 권장하지 않을 것입니다. 이점이 있다고 생각하십니까 (언급 한 것 제외). for-each 루프를 사용하지 않은 이유는 무엇입니까? 자체 변수를 사용하는 경우 반복자를 명시 적으로 정의 할 필요가 없습니다.
Willi Mentzel

@progressive_overload는 이터레이터가 필요한 경우 (예 : 라이브러리로 전달하기 위해 질문에 따라), 예제에서는 표시되지 않습니다. 이 예에서는 루프 외부에 변수가 있으며 #next를 한 번 호출하도록주의해야합니다. Paul의 예에서는 루프 외부에 변수가 없지만 #next와 #nextIndex를 함께 한 번 호출하도록주의해야합니다 (실제로 두 번 이상 사용하면 로컬 변수로 가져 와서이 예에서는 그렇지 않습니다. t 쇼).
Tom Clift

23

ListIterator계산을 수행하는 데 사용할 수 있습니다 .

final List<String> list = Arrays.asList("zero", "one", "two", "three");

for (final ListIterator<String> it = list.listIterator(); it.hasNext();) {
    final String s = it.next();
    System.out.println(it.previousIndex() + ": " + s);
}

12

어떤 종류의 컬렉션? List 인터페이스의 구현 인 경우 it.nextIndex() - 1.


4

용도 반복자 컬렉션을 반복합니다. 컬렉션이 목록이 아닌 경우 Arrays.asList(Collection.toArray())먼저 목록으로 전환하는 데 사용 합니다.


3

다음과 같이하십시오.

        ListIterator<String> it = list1.listIterator();
        int index = -1;
        while (it.hasNext()) {
            index++;
            String value = it.next();
            //At this point the index can be checked for the current element.

        }

4
indexOf ()를 호출하려면 장치 목록을 추가로 스캔해야합니다. 단순히 로컬 카운터를 증가시키는 것이 더 빠를 것입니다.
Greg Brown

1
동의했습니다. 이것은 가장 효율적인 솔루션이 아닙니다.
Sunny

1
더 효율적으로 예제를 업데이트 한 것 같습니다.
Greg Brown


1

를 참조하십시오 여기 .

iterator.nextIndex()에 대한 후속 호출에서 반환되는 요소의 인덱스를 제공합니다 next().


인터페이스 Iterator에는 nextIndex () 메서드가 없습니다. 이를 위해 ListIterator를 명시 적으로 사용해야하지만 OP는 Iterator에 대해 구체적으로 질문했습니다.
Fran Marzoa

0

iterator가있는 현재 인덱스를 반환하기 위해 iterator.nextIndex ()를 사용해야합니다. 이것은 자신의 카운터 변수를 사용하는 것보다 약간 쉬울 수 있습니다 (여전히 작동합니다).

public static void main(String[] args) {    
    String[] str1 = {"list item 1", "list item 2", "list item 3", "list item 4"};
    List<String> list1 = new ArrayList<String>(Arrays.asList(str1));

    ListIterator<String> it = list1.listIterator();

    int x = 0;

    //The iterator.nextIndex() will return the index for you.
    while(it.hasNext()){
        int i = it.nextIndex();
        System.out.println(it.next() + " is at index" + i); 
    }
}

이 코드는 list1 목록을 한 번에 한 항목 씩 살펴보고 항목의 텍스트를 인쇄 한 다음 "is at index"다음 반복기가 찾은 인덱스를 인쇄합니다. :)


1
실제로 코드는 it.next ()를 호출 한 후 인덱스를 표시하려고 시도하기 때문에 하나씩 꺼져 있습니다.
Henrik Aasted Sørensen 2014

0

이미 답을 알고 있었지만 정보를 추가해 보겠습니다.

컬렉션을 명시 적으로 언급했듯이 listIterator모든 유형의 컬렉션에 대한 색인을 가져 오는 데 사용할 수는 없습니다 .

목록 인터페이스 -ArrayList, LinkedList, Vector 및 Stack.

가지고 모두 iterator()listIterator()

인터페이스 설정 -HashSet, LinkedHashSet, TreeSet 및 EnumSet.

오직 iterator()

지도 인터페이스 -HashMap, LinkedHashMap, TreeMap 및 IdentityHashMap

더 반복자가 없습니다,하지만 통해 사용하여 반복 할 수 keySet()/ values()또는 entrySet()같은 keySet()entrySet()반환 Setvalues()반환Collection .

따라서 iterators()모든 컬렉션 유형에 대한 현재 인덱스를 가져 오기 위해 값을 지속적으로 증가시키면서 사용하는 것이 좋습니다 .


-1

이것이 가장 간단한 해결책이 될 것입니다!

std::vector<double> v (5);

for(auto itr = v.begin();itr != v.end();++itr){

 auto current_loop_index = itr - v.begin();

  std::cout << current_loop_index << std::endl;

}

gcc-9에서 -std=c++11플래그로

산출:

0
1
2
3
4

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.