Come ottenere l'indice corrente per ogni Kotlin


141

Come ottenere l'indice in a per ogni ciclo? Voglio stampare numeri per ogni seconda iterazione

Per esempio

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

In Java, abbiamo il tradizionale per loop

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

Come ottenere il i?


Risposte:


307

Oltre alle soluzioni fornite da @Audi, c'è anche forEachIndexed:

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

3
Wow, penso che questo sia migliore ... Grazie
Audi

1
Funziona su array e Iterables, su cos'altro ti serve per lavorare?
zsmb13,

1
Mi dispiace confuso con array java primitivi.
Audi,

Qualche modo di usare breakdentro?
Levon Petrosyan,

Non puoi interrompere l'intero ciclo, l'unica cosa che puoi fare è return@forEachIndexedche servirà essenzialmente continuea saltare all'elemento successivo. Se devi interrompere, dovresti avvolgerlo in una funzione e utilizzarlo returnnel loop per tornare da quella funzione che lo racchiude.
zsmb13,

96

Uso indices

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

Se si desidera un valore e un indice utilizzare withIndex()

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

Riferimento: flusso di controllo in kotlin


3
Penso che questa risposta sia migliore perché non ho bisogno di imparare qualcos'altro, solo il semplice ciclo 1
underfilho

22

prova questo; per loop

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

4
Sebbene questo codice possa rispondere alla domanda, fornire un contesto aggiuntivo riguardo a come e / o perché risolve il problema migliorerebbe il valore a lungo termine della risposta.
Ripristina Monica il

Come posso mettere un limite per questo loop? Come se fosse fino alla metà o ad alcuni numeri prima della fine
E. Akio,


9

Sembra che quello che stai davvero cercando sia filterIndexed

Per esempio:

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

Risultato:

b
d

1
considera anche l'uso di un riferimento alla funzione.forEach(::println)
Kirill Rakhman,

@KirillRakhman, usare i riferimenti alle funzioni è lo stile preferito in situazioni del genere? Sono nuovo di Kotlin, quindi sto ancora cercando di capire questa roba.
Akavall,

Tendo a usare i riferimenti alle funzioni ogni volta che è possibile. Quando hai più di un parametro, salvi un mucchio di caratteri rispetto all'utilizzo di una lambda. Ma è sicuramente una questione di gusti.
Kirill Rakhman,

3

Gli intervalli portano anche a codice leggibile in tali situazioni:

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

3
in alternativa(0..collection.lastIndex step 2)
Kirill Rakhman,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.