Як отримати поточний індекс для кожного Котліна


141

Як отримати індекс в а для кожного циклу? Я хочу надрукувати номери за кожну секунду ітерації

Наприклад

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

У java у нас є традиційний для циклу

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

Як отримати i?


Відповіді:


307

Окрім рішень, які надає @Audi, є також forEachIndexed:

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

3
Нічого собі, я думаю, що це краще ... Спасибі
Ауді

1
Він працює на масивах та інтерабелях, що ще потрібно для роботи?
zsmb13

1
Вибачте, що переплутали з примітивними масивами Java.
Ауді

Будь-який спосіб використання 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")
}

Довідково: Контрольний потік у котліні


3
Я думаю, що відповіді кращі, тому що не потрібно вчитися чомусь іншому, просто простий цикл +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, використовує посилання функцій бажаний стиль у таких ситуаціях? Я новачок у Котліні, тому все ще розгадую це.
Акавал

Я схильний використовувати посилання на функції, коли це можливо. Якщо у вас є більше одного параметра, ви зберігаєте купу символів порівняно з використанням лямбда. Але це справа смаку точно.
Кирило Рахман

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.