Как получить текущий индекс для каждого котлина

142

Как получить индекс в каждом цикле? Я хочу печатать числа для каждой второй итерации

Например

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

В java у нас есть традиционный цикл for

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

Как получить i?

Audi
источник
1
также см. stackoverflow.com/questions/46825787/…
s1m0nw1

Ответы:

307

В дополнение к решениям, предоставляемым @Audi, есть также forEachIndexed:

collection.forEachIndexed { index, element ->
    // ...
}
zsmb13
источник
3
Вау, я думаю, этот лучше ... Спасибо
Audi
1
Он работает с массивами и итерациями, над чем еще он вам нужен?
zsmb13
1
Извините, что перепутала с примитивными массивами Java.
Audi
Любой способ использовать breakвнутрь?
Левон Петросян
Вы не можете прервать весь цикл, единственное, что вы можете сделать, это то, return@forEachIndexedчто по сути будет служить continueпереходом к следующему элементу. Если вам нужно разорвать, вам нужно будет обернуть его функцией и использовать returnв цикле для возврата из этой включающей функции.
zsmb13
96

использование indices

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

Если вам нужна ценность, а также индекс Используйте withIndex()

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

Ссылка: Control-flow в котлине

Audi
источник
3
Я думаю, что эти ответы лучше, потому что не нужно изучать что-то еще, просто простой цикл for +1
underfilho
22

попробуй это; для цикла

for ((i, item) in arrayList.withIndex()) { }
alicanozkara
источник
4
Хотя этот код может ответить на вопрос, предоставление дополнительного контекста относительно того, как и / или почему он решает проблему, улучшит долгосрочную ценность ответа.
Восстановить Монику
Как я могу установить предел для этого цикла? Как это идет до половины или нескольких цифр до конца
Э.Акио
9

Кажется, что вы действительно ищете filterIndexed

Например:

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

Результат:

b
d
Akavall
источник
1
также рассмотрите возможность использования ссылки на функцию.forEach(::println)
Кирилл Рахман
@KirillRakhman, использует ли предпочтительный стиль ссылок на функции в подобных ситуациях? Я новичок в Котлине, поэтому я все еще разбираюсь в этом.
Akavall
Я стараюсь по возможности использовать ссылки на функции. Когда у вас есть более одного параметра, вы экономите кучу символов по сравнению с использованием лямбда. Но это точно дело вкуса.
Кирилл Рахман
3

Диапазоны также приводят к читаемому коду в таких ситуациях:

(0 until collection.size step 2)
    .map(collection::get)
    .forEach(::println)
s1m0nw1
источник
3
в качестве альтернативы(0..collection.lastIndex step 2)
Кирилл Рахман