更改Kotlin中的循环索引

时间:2018-01-26 09:40:43

标签: loops for-loop kotlin

如何在Kotlin中修改循环变量?

对于我的特殊情况,我有一个for循环,在某些条件下,我想跳过下一次迭代:

for(i in 0..n) {
  // ...
  if(someCond) {
    i++ // Skip the next iteration
  }
}

然而,当我尝试这个时,我告诉他们" val不能重新分配"。

4 个答案:

答案 0 :(得分:11)

你不能改变当前元素,你需要使用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,从而消除了filterwindowed创建新List的开销(因为他们现在都会返回Sequence S)。

如果您希望下一对不包含上一对的最后一个元素,请改用windowed(2, 2, false)

答案 1 :(得分:0)

看起来你真正要做的就是在列表上迭代一个大小为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]

答案 2 :(得分:0)

请尝试此方法,

for ((position, item) in list.withIndex()){
}

在这里您将获得位置和对象。

答案 3 :(得分:0)

虽然很多人描述了这个问题,并提出了一个我认为不适合初学者的高级方法或运算符的解决方案。 我对代码进行了修复,以便您可以轻松理解它,它仅使用 while 循环而不是 for 循环。如果您能理解它并发现它有用,请考虑接受答案

fun main(args:Array<String>){

    var alphabet = mutableListOf(
            'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm',
            'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'
    )
    var key = "keyword"
    println(key)
    for (i in key.indices)
    {
        var j = 0
        while (j < alphabet.size) {
            if (key[i] == alphabet[j]){
                alphabet.removeAt(j)     // 1. this line have error
            } else j++
        }
    }
    print(alphabet)
}