提问人:Bob Redity 提问时间:7/7/2022 最后编辑:AlexTBob Redity 更新时间:8/9/2022 访问量:976
如何在 Kotlin 中设置每个循环以避免越界异常
How to setup for each loop in Kotlin to avoid out of bounds exception
问:
在java中,我得到了这个结构
for (let i = 0; i < x.length-1; I++
在这里,为了避免我们正在使用,但是如何在 Kotlin 中做同样的事情?到目前为止,我得到了这个代码outOfBoundsException
x.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)
答:
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){
// ...
}
这与前面的方法类似,只是不包含最后一个元素。(所以从)。until
0 <= 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很好,谢谢。我已经编辑了答案以包括这个。
评论