在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) ,这更简单地完成, until0 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]