Jak uzyskać aktualny indeks dla każdego Kotlina

156

Jak uzyskać indeks w każdej pętli? Chcę wydrukować liczby dla każdej drugiej iteracji

Na przykład

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

W javie mamy tradycyjną pętlę for

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

Jak zdobyć i?

Audi
źródło

Odpowiedzi:

346

Oprócz rozwiązań dostarczonych przez @Audi dostępne są również forEachIndexed:

collection.forEachIndexed { index, element ->
    // ...
}
zsmb13
źródło
3
Wow, myślę, że ten jest lepszy ... Dzięki
Audi
1
Działa na tablicach i tablicach iterowalnych, nad czym jeszcze ma pracować?
zsmb13
1
Przepraszam, że pomyliłem się z prymitywnymi tablicami Java.
Audi,
Jakikolwiek sposób na użycie w breakśrodku?
Levon Petrosyan
Nie możesz oderwać się od całej pętli, jedyną podobną rzeczą, jaką możesz zrobić, jest to, return@forEachIndexedże zasadniczo posłuży jako przejście continuedo następnego elementu. Jeśli chcesz przerwać, musisz owinąć ją w funkcję i użyć returnw pętli, aby powrócić z tej otaczającej funkcji.
zsmb13
103

Posługiwać się indices

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

Jeśli chcesz mieć wartość, a także indeks Użyj withIndex()

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

Odniesienie: Control-flow in kotlin

Audi
źródło
4
Myślę, że ta odpowiedź jest lepsza, ponieważ nie trzeba się uczyć niczego innego, wystarczy prosta pętla for +1
underfilho
23

Spróbuj tego; dla pętli

for ((i, item) in arrayList.withIndex()) { }
alicanozkara
źródło
5
Chociaż ten kod może odpowiedzieć na pytanie, dostarczenie dodatkowego kontekstu dotyczącego tego, jak i / lub dlaczego rozwiązuje problem, poprawiłoby długoterminową wartość odpowiedzi.
Przywróć Monikę
Jak mogę ustawić limit dla tej pętli? Jakby to
trwało
9

Wygląda na to, że tak naprawdę szukasz filterIndexed

Na przykład:

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

Wynik:

b
d
Akavall
źródło
1
rozważ również użycie odniesienia do funkcji.forEach(::println)
Kirill Rakhman
@KirillRakhman, czy w takich sytuacjach używasz preferowanego stylu odwołań do funkcji? Jestem nowy w Kotlinie, więc wciąż zastanawiam się nad tym.
Akavall
Kiedy tylko jest to możliwe, staram się używać odwołań do funkcji. Jeśli masz więcej niż jeden parametr, oszczędzasz kilka znaków w porównaniu z użyciem lambdy. Ale to na pewno kwestia gustu.
Kirill Rakhman
3

Zakresy prowadzą również do czytelnego kodu w takich sytuacjach:

(0 until collection.size step 2)
    .map(collection::get)
    .forEach(::println)
s1m0nw1
źródło
4
alternatywnie(0..collection.lastIndex step 2)
Kirill Rakhman
0

Przykład działania forEachIndexedw systemie Android

Iteruj z Index

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

Zaktualizuj listę za pomocą indeksu

itemList.forEachIndexed{ index, item -> item.isSelected= position==index}
Hitesh Sahu
źródło