如何获取每个Kotlin的当前索引


Answers:


306

除了@Audi提供的解决方案之外,还有forEachIndexed

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

3
哇,我认为这是更好的...谢谢
奥迪

1
它适用于数组和可迭代对象,您还需要其他什么工作?
zsmb13 '18

对不起,原始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")
}

参考:Kotlin中的控制流


3
我认为此答案更好,因为不需要学习其他东西,只需简单的for循环+1
underfilho

22

试试这个; for循环

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

4
尽管此代码可以回答问题,但提供有关如何和/或为什么解决问题的其他上下文将提高​​答案的长期价值。
恢复莫妮卡

我如何对此循环设置限制?就像它直到一半或一些数字才结束
E.Akio


9

看来您真正要寻找的是 filterIndexed

例如:

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

结果:

b
d

1
还考虑使用函数引用.forEach(::println)
Kirill Rakhman

@KirillRakhman,在这种情况下使用函数引用首选样式吗?我是Kotlin的新手,所以我仍然在弄清楚这些东西。
Akavall

我倾向于尽可能使用函数引用。当您有多个参数时,与使用lambda相比,您可以节省一堆字符。但这肯定是一个品味问题。
Kirill Rakhman

3

在以下情况下,范围也会导致代码可读:

(0 until collection.size step 2)
    .map(collection::get)
    .forEach(::println)

3
或者(0..collection.lastIndex step 2)
Kirill Rakhman
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.