Cara mendapatkan indeks saat ini untuk setiap Kotlin

141

Bagaimana cara mendapatkan indeks untuk setiap loop? Saya ingin mencetak angka untuk setiap iterasi kedua

Sebagai contoh

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

Di java, kita memiliki tradisional untuk loop

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

Bagaimana cara mendapatkannya i?

Audi
sumber

Jawaban:

307

Selain solusi yang diberikan oleh @Audi, ada juga forEachIndexed:

collection.forEachIndexed { index, element ->
    // ...
}
zsmb13
sumber
3
Wow saya pikir yang ini lebih baik ... Terima kasih
Audi
1
Ini berfungsi pada Array dan Iterables, apa lagi yang Anda butuhkan untuk dikerjakan?
zsmb13
1
Maaf bingung dengan array java primitif.
Audi
Ada cara untuk digunakan breakdi dalam?
Levon Petrosyan
Anda tidak dapat memutus dari seluruh loop, satu-satunya hal serupa yang dapat Anda lakukan adalah return@forEachIndexedyang pada dasarnya akan berfungsi sebagai continueuntuk melompat ke elemen berikutnya. Jika Anda perlu istirahat, Anda harus membungkusnya dalam suatu fungsi, dan gunakan returndalam loop untuk kembali dari fungsi terlampir itu.
zsmb13
96

Menggunakan indices

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

Jika Anda ingin nilai serta Penggunaan indeks withIndex()

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

Referensi: Aliran kontrol di kotlin

Audi
sumber
3
Saya pikir jawaban ini lebih baik karena tidak perlu mempelajari hal lain, cukup sederhana untuk loop +1
underfilho
22

coba ini; untuk loop

for ((i, item) in arrayList.withIndex()) { }
alicanozkara
sumber
4
Sementara kode ini dapat menjawab pertanyaan, memberikan konteks tambahan tentang bagaimana dan / atau mengapa memecahkan masalah akan meningkatkan nilai jangka panjang jawaban.
Pasang kembali Monica
Bagaimana saya bisa menetapkan batas untuk loop ini? Menyukai sampai setengah atau beberapa angka sebelum akhir
E.Akio
9

Tampaknya apa yang benar-benar Anda cari adalah filterIndexed

Sebagai contoh:

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

Hasil:

b
d
Akavall
sumber
1
juga mempertimbangkan menggunakan referensi fungsi.forEach(::println)
Kirill Rakhman
@ KirillRakhman, apakah menggunakan referensi fungsi gaya yang disukai dalam situasi seperti itu? Saya baru di Kotlin, jadi saya masih memikirkan hal ini.
Akavall
Saya cenderung menggunakan referensi fungsi bila memungkinkan. Ketika Anda memiliki lebih dari satu parameter, Anda menyimpan banyak karakter dibandingkan dengan menggunakan lambda. Tapi itu soal selera pasti.
Kirill Rakhman
3

Rentang juga menyebabkan kode dapat dibaca dalam situasi seperti ini:

(0 until collection.size step 2)
    .map(collection::get)
    .forEach(::println)
s1m0nw1
sumber
3
sebagai alternatif(0..collection.lastIndex step 2)
Kirill Rakhman