如何在Kotlin中修改循环变量?
对于我的特殊情况,我有一个for循环,在某些条件下,我想跳过下一次迭代:
for(i in 0..n) {
// ...
if(someCond) {
i++ // Skip the next iteration
}
}
然而,当我尝试这个时,我告诉他们" val不能重新分配"。
答案 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
,从而消除了filter
和windowed
创建新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)
}