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?


Jawaban:


307

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

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

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


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

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

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)

3
sebagai alternatif(0..collection.lastIndex step 2)
Kirill Rakhman
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.