Comment obtenir l'index actuel pour chaque Kotlin

142

Comment obtenir l'index dans un pour chaque boucle? Je veux imprimer des nombres pour chaque deuxième itération

Par exemple

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

En java, nous avons la traditionnelle boucle for

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

Comment obtenir le i?

Audi
la source

Réponses:

307

En plus des solutions proposées par @Audi, il y a aussi forEachIndexed:

collection.forEachIndexed { index, element ->
    // ...
}
zsmb13
la source
3
Wow, je pense que celui-ci est meilleur ... Merci
Audi
1
Cela fonctionne sur les tableaux et les itérables, sur quoi avez-vous besoin d'autre pour travailler?
zsmb13
1
Désolé confondu avec les tableaux java primitifs.
Audi
Un moyen de l'utiliser à l' breakintérieur?
Levon Petrosyan
Vous ne pouvez pas rompre la boucle entière, la seule chose similaire que vous pouvez faire est return@forEachIndexedqui servira essentiellement continueà passer à l'élément suivant. Si vous avez besoin de casser, vous devez l'envelopper dans une fonction et l'utiliser returndans la boucle pour revenir à partir de cette fonction englobante.
zsmb13
96

Utilisation indices

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

Si vous voulez la valeur ainsi que l'index Utilisez withIndex()

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

Référence: Control-flow dans kotlin

Audi
la source
3
Je pense que cette réponse est meilleure parce que vous n'avez pas besoin d'apprendre autre chose, juste la simple boucle for +1
underfilho
22

essaye ça; pour boucle

for ((i, item) in arrayList.withIndex()) { }
alicanozkara
la source
4
Bien que ce code puisse répondre à la question, fournir un contexte supplémentaire sur la manière et / ou la raison pour laquelle il résout le problème améliorerait la valeur à long terme de la réponse.
Réintégrer Monica
Comment puis-je mettre une limite pour cette boucle? Comme ça va jusqu'à la moitié ou quelques nombres avant la fin
E.Akio
9

Il semble que ce que vous recherchez vraiment filterIndexed

Par exemple:

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

Résultat:

b
d
Akavall
la source
1
envisagez également d'utiliser une référence de fonction.forEach(::println)
Kirill Rakhman
@KirillRakhman, est-ce que l'utilisation des références de fonction est un style préféré dans de telles situations? Je suis nouveau à Kotlin, donc je suis toujours en train de comprendre ce truc.
Akavall
J'ai tendance à utiliser des références de fonction chaque fois que possible. Lorsque vous avez plus d'un paramètre, vous enregistrez un tas de caractères par rapport à l'utilisation d'un lambda. Mais c'est une question de goût, c'est sûr.
Kirill Rakhman
3

Les plages conduisent également à un code lisible dans de telles situations:

(0 until collection.size step 2)
    .map(collection::get)
    .forEach(::println)
s1m0nw1
la source
3
alternativement(0..collection.lastIndex step 2)
Kirill Rakhman