Como obter o índice atual para cada Kotlin

141

Como obter o índice em um para cada loop? Quero imprimir números para cada segunda iteração

Por exemplo

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

Em java, temos o loop for tradicional

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

Como obter o i?

Audi
fonte

Respostas:

307

Além das soluções fornecidas pela @Audi, há também forEachIndexed:

collection.forEachIndexed { index, element ->
    // ...
}
zsmb13
fonte
3
Wow eu acho que isso é o melhor ... Obrigado
Audi
1
Funciona em Arrays e Iterables. Em que mais você precisa trabalhar?
precisa saber é o seguinte
1
Desculpe confundido com matrizes java primitivas.
Audi
Alguma maneira de usar breakdentro?
Levon Petrosyan
Você não pode romper com o loop inteiro, a única coisa semelhante que você pode fazer é return@forEachIndexedque essencialmente servirá como continuepara pular para o próximo elemento. Se você precisar interromper, precisará envolvê-lo em uma função e usá-lo returnno loop para retornar dessa função anexa.
Zsmb13
96

Usar indices

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

Se você deseja valor e índice, use withIndex()

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

Referência: fluxo de controle no kotlin

Audi
fonte
3
Eu acho que estas respostas é melhor porque não precisa aprender algo mais, apenas o simples loop for +1
underfilho
22

tente isso; para laço

for ((i, item) in arrayList.withIndex()) { }
alicanozkara
fonte
4
Embora esse código possa responder à pergunta, fornecer um contexto adicional sobre como e / ou por que resolve o problema melhoraria o valor a longo prazo da resposta.
Reintegrar Monica
Como posso colocar um limite para esse loop? Como vai até metade ou alguns números antes do final
E.Akio
9

Parece que o que você está realmente procurando é filterIndexed

Por exemplo:

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

Resultado:

b
d
Akavall
fonte
1
considere também usar uma referência de função.forEach(::println)
Kirill Rakhman
@KirillRakhman, o estilo preferido das referências de função está em situações como essa? Eu sou novo em Kotlin, então ainda estou descobrindo essas coisas.
Akavall
Costumo usar referências de função sempre que possível. Quando você possui mais de um parâmetro, salva vários caracteres em comparação ao uso de uma lambda. Mas é uma questão de gosto, com certeza.
Kirill Rakhman
3

As faixas também levam ao código legível nessas situações:

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