Her bir Kotlin için güncel endeksi nasıl alabilirim?


143

Her döngü için bir indeks nasıl alınır? Her ikinci yineleme için sayı yazdırmak istiyorum

Örneğin

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

Java'da geleneksel for döngüsüne sahibiz

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

Nasıl alınır i?


Yanıtlar:


308

@Audi tarafından sağlanan çözümlere ek olarak, ayrıca forEachIndexed:

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

3
Vay be, bunun daha iyi olduğunu düşünüyorum ... Teşekkürler
— Audi

1
Diziler ve Yinelemeler üzerinde çalışır, üzerinde çalışmak için başka ne gerekir?
— zsmb13

1
Özür dilerim ilkel java dizileriyle karıştırıldık.
— Audi

breakİçeride kullanmanın bir yolu var mı?
— Levon Petrosyan

Döngünün tamamından kopamazsınız, yapabileceğiniz tek benzer şey return@forEachIndexed, esasen bir continuesonraki öğeye atlamak için bir işlev görecek olmasıdır . Eğer kırmanız gerekirse, onu bir fonksiyona sarmanız ve returnbu çevreleyen fonksiyondan dönmek için döngüde kullanmanız gerekir.
— zsmb13

96

kullanım indices

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

Değer ve indeks kullanmak istiyorsanız withIndex()

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

Referans: Kotlin'de kontrol akışı


3
Bence bu yanıt daha iyi çünkü başka bir şey öğrenmeye gerek yok, sadece for döngüsü +1
— underfilho

23

bunu dene; döngü için

for ((i, item) in arrayList.withIndex()) { }

4
Bu kod soruyu yanıtlayabilirken, sorunu nasıl ve / veya neden çözdüğüne ilişkin ek bağlam sağlamak, yanıtlayanın uzun vadeli değerini artıracaktır.
— Monica'yı eski

Bu döngü için nasıl limit koyabilirim? Sanki bitmeden önce yarıya veya bazı sayılara kadar gidiyor
— E.Akio


9

Görünüşe göre gerçekten aradığınız şey filterIndexed

Örneğin:

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

Sonuç:

b
d

1
ayrıca bir işlev referansı kullanmayı düşünün.forEach(::println)
— Kirill Rakhman

@KirillRakhman, böyle durumlarda işlev referansları tercih edilen stil kullanıyor mu? Kotlin'de yeniyim, bu yüzden hala bu şeyleri çözmeye çalışıyorum.
— Akavall

Mümkün olduğunda işlev referanslarını kullanma eğilimindeyim. Birden fazla parametreniz olduğunda, lambda kullanmaya kıyasla bir dizi karakter kaydedersiniz. Ama kesinlikle bir zevk meselesi.
— Kirill Rakhman

3

Aralıklar ayrıca bu gibi durumlarda okunabilir koda yol açar:

(0 until collection.size step 2)
    .map(collection::get)
    .forEach(::println)

3
alternatif olarak(0..collection.lastIndex step 2)
— Kirill Rakhman

0

Çalışma Örneği forEachIndexedAndroid'de

Dizin ile yineleyin

itemList.forEachIndexed{index, item -> 
println("index = $index, item = $item ")
}

Dizini Kullanarak Listeyi Güncelle

itemList.forEachIndexed{ index, item -> item.isSelected= position==index}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.