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?


Respuestas:


307

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

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

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


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

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

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)

3
alternativamente(0..collection.lastIndex step 2)
Kirill Rakhman
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.