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?


Réponses:


307

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

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

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


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()) { }

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

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)

3
alternativement(0..collection.lastIndex step 2)
Kirill Rakhman
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.