Cómo obtener el índice actual para cada Kotlin

141

¿Cómo obtener el índice en un para cada ciclo? Quiero imprimir números para cada segunda iteración

Por ejemplo

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

En Java, tenemos el tradicional bucle for

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

¿Cómo conseguir el i?

Audi
fuente

Respuestas:

307

Además de las soluciones proporcionadas por @Audi, también hay forEachIndexed:

collection.forEachIndexed { index, element ->
    // ...
}
zsmb13
fuente
3
Wow, creo que este es mejor ... Gracias
Audi
1
Funciona en matrices e Iterables, ¿qué más necesita para trabajar?
zsmb13
1
Lo siento confundido con las primitivas matrices de Java.
Audi
¿Alguna forma de usar breakdentro?
Levon Petrosyan
No puede romper todo el ciclo, lo único que puede hacer es return@forEachIndexedlo que esencialmente servirá como continuesaltar al siguiente elemento. Si necesita romper, tendría que envolverlo en una función y usarlo returnen el bucle para regresar de esa función de cierre.
zsmb13
96

Utilizar indices

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

Si desea valor e índice Use withIndex()

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

Referencia: Control de flujo en kotlin

Audi
fuente
3
Creo que esta respuesta es mejor porque no necesita aprender algo más, solo el simple for loop +1
underfilho
22

prueba esto; en bucle

for ((i, item) in arrayList.withIndex()) { }
alicanozkara
fuente
44
Si bien este código puede responder la pregunta, proporcionar un contexto adicional con respecto a cómo y / o por qué resuelve el problema mejoraría el valor a largo plazo de la respuesta.
Restablece a Monica el
¿Cómo puedo poner un límite a este ciclo? Como si fuera hasta la mitad o algunos números antes del final
E. Akio
9

Parece que lo que realmente estás buscando es filterIndexed

Por ejemplo:

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

Resultado:

b
d
Akavall
fuente
1
también considere usar una referencia de función.forEach(::println)
Kirill Rakhman,
@KirillRakhman, ¿está usando el estilo preferido de referencias de función en situaciones como esa? Soy nuevo en Kotlin, así que todavía estoy resolviendo esto.
Akavall
Tiendo a usar referencias de funciones siempre que sea posible. Cuando tiene más de un parámetro, guarda un montón de caracteres en comparación con el uso de una lambda. Pero es cuestión de gustos seguro.
Kirill Rakhman
3

Los rangos también conducen a un código legible en tales situaciones:

(0 until collection.size step 2)
    .map(collection::get)
    .forEach(::println)
s1m0nw1
fuente
3
alternativamente(0..collection.lastIndex step 2)
Kirill Rakhman