So erhalten Sie den aktuellen Index für jeden Kotlin


139

Wie bekomme ich den Index in a für jede Schleife? Ich möchte Zahlen für jede zweite Iteration drucken

Beispielsweise

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

In Java haben wir die traditionelle for-Schleife

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

Wie bekomme ich das i?


Antworten:


303

Zusätzlich zu den von @Audi bereitgestellten Lösungen gibt es auch forEachIndexed:

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

3
Wow ich denke das ist besser ... Danke
Audi

1
Es funktioniert auf Arrays und Iterables. Woran müssen Sie noch arbeiten?
zsmb13

Entschuldigung, verwechselt mit primitiven Java-Arrays.
Audi

Wie kann man es breakdrinnen benutzen ?
Levon Petrosyan

Sie können nicht von der gesamten Schleife abbrechen. Das einzige, was Sie tun können, ist return@forEachIndexed, im Wesentlichen continuezum nächsten Element zu springen. Wenn Sie brechen müssen, müssen Sie es in eine Funktion returneinschließen und in der Schleife verwenden, um von dieser umschließenden Funktion zurückzukehren.
zsmb13

95

Verwenden indices

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

Wenn Sie Wert sowie Index verwenden möchten withIndex()

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

Referenz: Kontrollfluss in Kotlin


3
Ich denke, diese Antwort ist besser, weil Sie nichts anderes lernen müssen, nur die einfache for-Schleife +1
underfilho

22

Versuche dies; für Schleife

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

4
Während dieser Code die Frage möglicherweise beantwortet, würde die Bereitstellung eines zusätzlichen Kontexts darüber, wie und / oder warum das Problem gelöst wird, den langfristigen Wert der Antwort verbessern.
Stellen Sie Monica

Wie kann ich ein Limit für diese Schleife setzen? Wie es geht bis zur Hälfte oder einige Zahlen vor dem Ende
E.Akio


8

Es scheint, dass das, wonach Sie wirklich suchen, ist filterIndexed

Beispielsweise:

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

Ergebnis:

b
d

.forEach(::println)
Erwägen Sie

@KirillRakhman, verwendet die Verwendung von Funktionsreferenzen in solchen Situationen den bevorzugten Stil? Ich bin neu in Kotlin, also finde ich dieses Zeug immer noch heraus.
Akavall

Ich neige dazu, Funktionsreferenzen zu verwenden, wann immer dies möglich ist. Wenn Sie mehr als einen Parameter haben, speichern Sie eine Reihe von Zeichen im Vergleich zur Verwendung eines Lambda. Aber es ist sicher Geschmackssache.
Kirill Rakhman

3

Bereiche führen auch in solchen Situationen zu lesbarem Code:

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

3
alternativ(0..collection.lastIndex step 2)
Kirill Rakhman
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.