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?

Audi
quelle

Antworten:

303

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

collection.forEachIndexed { index, element ->
    // ...
}
zsmb13
quelle
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

Audi
quelle
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()) { }
alicanozkara
quelle
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
Akavall
quelle
.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)
s1m0nw1
quelle
3
alternativ(0..collection.lastIndex step 2)
Kirill Rakhman