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.