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.