如何设置 Kotlin 中的每个循环以避免越界异常

Bob*_*ity 3 kotlin

在java中我得到了这个结构

for (let i = 0; i < x.length-1; I++
Run Code Online (Sandbox Code Playgroud)

在这里为了避免outOfBoundsException我们使用x.length-1但是如何在 Kotlin 中做同样的事情?到目前为止我得到了这个代码

x.forEachIndexed { index, _ ->
    output.add((x[index+1]-x[index])*10)
}
Run Code Online (Sandbox Code Playgroud)

当我们调用时它在最后一个元素上崩溃,x[index+1]所以我需要以某种方式处理最后一个元素

输入列表

var x = doubleArrayOf(0.0, 0.23, 0.46, 0.69, 0.92, 1.15, 1.38, 1.61)
Run Code Online (Sandbox Code Playgroud)

Ale*_*exT 6

你已经有了答案,但这是另一种选择。如果您使用普通列表,则可以访问zipWithNext(),然后您无需担心任何索引,您可以执行以下操作:

list.zipWithNext { current, next ->
    output.add((next - current)*10)
}
Run Code Online (Sandbox Code Playgroud)

正如 k314159 所提到的,我们还可以asList()直接访问zipWithNext和其他列表方法,没有很多缺点。

array.asList().zipWithNext { current, next ->
    output.add(next - current)
}
Run Code Online (Sandbox Code Playgroud)


Ion*_*nut 5

对于经典的 Java for 循环,Kotlin 中有两个选择。

一个会是这样的。

val x = listOf(1,2,3,4)

for (i in 0 .. x.lastIndex){
    // ...
}
Run Code Online (Sandbox Code Playgroud)

使用..你基本上从 0 到(并包括)与第二项对应的数字,在本例中是列表的最后一个索引。(所以从0 <= i <= x.lastIndex)

第二个选项是使用until

val x = listOf(1,2,3,4)

for (i in 0 until x.size){
    // ...
}
Run Code Online (Sandbox Code Playgroud)

这与之前的方法类似,只是until不包含最后一个元素。(因此来自0 <= i < x.size)。

你可能需要的是这样的东西

val x = listOf(1,2,3,4)

for (i in 0 .. x.lastIndex -1){
    // ...
}
Run Code Online (Sandbox Code Playgroud)

或替代方案,使用until,像这样

val x = listOf(1,2,3,4)

for (i in 0 until x.size-1){
    // ...
}
Run Code Online (Sandbox Code Playgroud)

这可能应该避免 IndexOut ofbounds 错误,因为您只是直到倒数第二个项目索引。

如果有不清楚的地方,请随时询问。

如果您想了解有关范围的更多信息,这也是一本很好的读物。https://kotlinlang.org/docs/ranges.html#progression