在Kotlin中更改循环索引
我如何修改Kotlin中的循环variables?
对于我的具体情况,我有一个for循环,其中,在某些情况下,我想跳过下一个迭代:
for(i in 0..n) { // ... if(someCond) { i++ // Skip the next iteration } }
但是,当我尝试这个时,我被告知“val不能被重新分配”。
你不能改变当前元素,你需要使用while
循环:
var i = 0 while (i <= n) { // do something if (someCond) { i++ // Skip the next iteration } i++ }
你想做什么? 有一个机会有一个更习惯的方式来做到这一点。
如果你可以重构这个逻辑来跳过当前的迭代,为什么不使用continue
:
for (i in 0..n) { if (someCond) { continue } // ... }
附注: ..
范围是包容性的,所以要循环通过例如大小为n
的列表,您通常需要0..(n - 1)
,这更简单地完成, until
: 0 until n
。
编辑:关于你说的,使用step
应该工作:
for (i in 0 until n step 2) { val first = list[i] val second = list[i + 1] if (someCond) continue // ... }
(这也将确保i + 1
在范围内)
编辑2:尝试windowed
(Kotlin 1.2):
list.asSequence().filter { someCond }.windowed(2, 1, false).forEach { val (first, second) = it // ... }
asSequence
会将列表转换为一个Sequence
,消除filter
的开销,并创建一个新的List
(因为它们现在都返回Sequence
)。
如果您希望下一对不包含前一对的最后一个元素,请使用windowed(2, 2, false)
。
它看起来像你真正想要做的是迭代大小为2的滑动窗口在列表上。 如果您使用kotlin 1.2或更高版本,则可以使用List.windowed()
库函数。
例如,要考虑每一对相邻的元素,但是丢弃那些第二对是负数的元素,你可以这样做:
val list = listOf(1, 2, 3, -4, -5, 6) list.windowed(2,1).filter { it[1] > 0 }.apply(::println)
哪个会打印出来
[[1, 2], [2, 3], [-5, 6]]
跳过对[3,-4]和[-4,-5]