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?


Respostas:


307

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

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

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


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

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

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)

3
alternativamente(0..collection.lastIndex step 2)
— Kirill Rakhman
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.