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

How to setup for each loop in Kotlin to avoid out of bounds exception

提问人:Bob Redity 提问时间:7/7/2022 最后编辑:AlexTBob Redity 更新时间:8/9/2022 访问量:976

问:

在java中,我得到了这个结构

for (let i = 0; i < x.length-1; I++

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

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

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

输入列表

var x = doubleArrayOf(0.0, 0.23, 0.46, 0.69, 0.92, 1.15, 1.38, 1.61)
科特林

评论

0赞 lukas.j 7/7/2022
你能为输入列表 x 发布一个样本吗?
0赞 Bob Redity 7/7/2022
@lukas.j 添加了我正在修改的数组

答:

5赞 Ionut 7/7/2022 #1

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

一个是这样的。

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

for (i in 0 .. x.lastIndex){
    // ...
}

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

第二种选择是使用until

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

for (i in 0 until x.size){
    // ...
}

这与前面的方法类似,只是不包含最后一个元素。(所以从)。until0 <= i < x.size

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

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

for (i in 0 .. x.lastIndex -1){
    // ...
}

或者,使用 ,像这样until

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

for (i in 0 until x.size-1){
    // ...
}

这应该可以避免 IndexOut of bounds 错误,因为您只转到倒数第二项索引。

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

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

评论

1赞 Bob Redity 7/7/2022
完善。这个范围就是我一直在寻找的until
1赞 Ionut 7/7/2022
@BobRedity 很高兴我能帮上忙。如有疑问,请始终转到 Kotlin 文档,它非常有用且编写得很好。
1赞 Tenfour04 7/7/2022
IMO,比这些选项中的任何一个都好for (i in x.indices)
0赞 Ionut 7/7/2022
@Tenfour04没错,这是另一种有效的方法,而且更容易使用,但我想尽可能接近他所描述的经典 Java 循环。
0赞 Tenfour04 7/7/2022
哦,我错过了 OP 在循环中对一个过去的 i 进行采样。
6赞 AlexT 7/7/2022 #2

你已经有了一个答案,但这是另一种选择。如果你使用一个普通的列表,你就可以访问,然后你不需要担心任何索引,你可以做:zipWithNext()

list.zipWithNext { current, next ->
    output.add((next - current)*10)
}

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

array.asList().zipWithNext { current, next ->
    output.add(next - current)
}

评论

0赞 Some random IT boy 7/7/2022
两者都投了赞成票,因为功能运营商获胜
1赞 k314159 7/7/2022
用代替 ;这样你就不会复制数组了。asList()toList()
1赞 k314159 7/7/2022
不,您从中获取的列表只是原始数组的视图。因此,如果你这样做:你会得到,因为列表只是数组的一个视图。如果改用,则列表将保留,因为它是数组原始值的副本。asList()val a = arrayOf(1,2); val l = a.asList(); a[0] = 3; println(l);[3,2]toList()[1,2]
1赞 k314159 7/8/2022
你可以在 github.com/JetBrains/kotlin/blob/ 看到它的实现... - 它非常简单,你可以看到它没有创建任何副本。所有对 等的调用都直接作用于原始数组。get()size
1赞 AlexT 7/8/2022
@k314159很好,谢谢。我已经编辑了答案以包括这个。