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


142

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

Например

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

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

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

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


Ответы:


307

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

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

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 в котлине


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

22

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

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

4
Хотя этот код может ответить на вопрос, предоставление дополнительного контекста относительно того, как и / или почему он решает проблему, улучшит долгосрочную ценность ответа.
Восстановить Монику

Как я могу установить предел для этого цикла? Как это идет до половины или нескольких цифр до конца
Э.Акио


9

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

Например:

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

Результат:

b
d

1
также рассмотрите возможность использования ссылки на функцию.forEach(::println)
Кирилл Рахман

@KirillRakhman, использует ли предпочтительный стиль ссылок на функции в подобных ситуациях? Я новичок в Котлине, поэтому я все еще разбираюсь в этом.
Akavall

Я стараюсь по возможности использовать ссылки на функции. Когда у вас есть более одного параметра, вы экономите кучу символов по сравнению с использованием лямбда. Но это точно дело вкуса.
Кирилл Рахман

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.