각 Kotlin에 대한 현재 색인을 얻는 방법


141

각 루프마다 인덱스를 얻는 방법은 무엇입니까? 매초마다 숫자를 인쇄하고 싶습니다.

예를 들어

for (value in collection) {
    if (iteration_no % 2) {
        //do something
    }
}

자바에서는 전통적인 for 루프가 있습니다.

for (int i = 0; i < collection.length; i++)

얻는 방법 i?


답변:


307

@Audi에서 제공하는 솔루션 외에도 다음이 있습니다 forEachIndexed.

collection.forEachIndexed { index, element ->
    // ...
}

3
와우 내가이 하나 더 생각 ... 감사합니다
아우디

1
그것은 Arrays와 Iterables에서 작동합니다. 다른 작업이 필요합니까?
zsmb13

1
원시 Java 배열과 혼동하여 죄송합니다.
아우디

break내부 에서 사용할 방법이 있습니까?
Levon Petrosyan

당신은 당신이 할 수있는 유일한 비슷한 일이, 전체 루프에서 분리 할 수 없습니다 return@forEachIndexedA는 본질적 역할을 할 continue다음 요소로 건너 뜁니다. 중단 해야하는 경우 함수로 감싸고 return루프에서 사용 하여 해당 함수를 반환해야합니다.
zsmb13

96

사용하다 indices

for (i in array.indices) {
    print(array[i])
}

인덱스뿐만 아니라 가치를 원한다면 withIndex()

for ((index, value) in array.withIndex()) {
    println("the element at $index is $value")
}

참조 : kotlin의 제어 흐름


3
이 질문에 대한 답은 더 좋을 것이라고 생각합니다. 다른 것을 배울 필요가 없습니다. 간단한 for 루프 +1
underfilho

22

이 시도; for 루프

for ((i, item) in arrayList.withIndex()) { }

4
이 코드는 질문에 대답 할 수 있지만 문제를 해결하는 방법 및 / 또는 이유에 대한 추가 컨텍스트를 제공하면 답변의 장기적인 가치가 향상됩니다.
복원 Monica Monica

이 루프를 어떻게 제한 할 수 있습니까? 마치 끝나기 전에 절반 또는 몇 개의 숫자가 나올 때처럼
E.Akio


9

당신이 정말로 찾고있는 것은 filterIndexed

예를 들면 다음과 같습니다.

listOf("a", "b", "c", "d")
    .filterIndexed { index, _ ->  index % 2 != 0 }
    .forEach { println(it) }

결과:

b
d

1
또한 함수 참조를 사용하는 것을 고려.forEach(::println)
키릴 Rakhman

@ KirillRakhman, 그런 상황에서 함수 참조 선호 스타일을 사용하고 있습니까? 나는 Kotlin을 처음 사용하므로 여전히이 자료를 파악하고 있습니다.
Akavall

가능할 때마다 함수 참조를 사용하는 경향이 있습니다. 둘 이상의 매개 변수가 있으면 람다를 사용하는 것과 비교하여 많은 문자를 저장합니다. 그러나 그것은 확실히 맛의 문제입니다.
Kirill Rakhman

3

범위 는 다음과 같은 상황에서 읽을 수있는 코드로 이어집니다.

(0 until collection.size step 2)
    .map(collection::get)
    .forEach(::println)

3
다른 방법(0..collection.lastIndex step 2)
키릴 Rakhman
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.