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?


Odpowiedzi:


346

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

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

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


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

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

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)

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}
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.