kotlin的for循环里面有没有办法操作索引?


#1

比如遍历一个list,然后根据当前元素的值判断是否跳过接下来的n个元素。

var i = 0
while (i <= n) {
    // do something        
    if (someCond) {
        i++ // Skip the next iteration
    }
    i++
}

除了上面这样还有更好的写法么?


#2

用 foreach filter :thinking:


#3

这需求,首先就已经毙掉那一大票高阶函数了(因为无法跳过)

用for的话应该也可以实现,但是需要多写一大堆东西,并且很容易造成只有作者才能看懂代码(并且可能过了些日子连作者也忘记这堆代码是干什么了)的情况

最简单的我觉得就是直接用while了


#4

有时候用用 while 没啥不好的 :grinning:


#5

我是刚学Kotlin,大神轻喷。
用AS试了下,发现Kotlin的for循环中的值与索引都是val,所以不允许循环体内修改索引值, 需要跳过只能用while。例如:

            val testList = listOf(1, 2, 3, 4, 5, 6)
            for (index in testList.indices) {
               println(index)
            }

不过考虑题主的需求,可以尝试使用尾递归来实现功能,代码如下:

    tailrec fun skip_test(data: List<Int>, n: Int) {
        if (n < data.size) {
            val value = data[n]
            if (value % 2 == 0) {
                skip_test(data, n + 2)
            }else{
                skip_test(data, n + 1)
            }
        }else{
            println("done!")
       }
    }

#6

在kotlin中,for循环摒弃了java中for(;;)的写法,这类写法由while代劳

这样的需求应该写不出特别简洁的代码,至于用for还是while得看list是什么类型
while因为没有迭代器,所以只能使用get函数,不适用于linked链表,对于这类,使用continue逐个跳过元素反而更有效率
···
for(e in linkedList) {
if (predicate) continue
// TODO something for e
}
···
对于数组或arrayList之类,while就很好了,暂时不必考虑其它写法

根据实际环境,在一些轻量场景下,可以先使用filter过滤一次
···
list.filter { e -> predicate(e) }.forEach { e -> // TODO something for e }
···

事实上,在循环体内操作索引的思路,在实际项目中不利于代码的理解和维护,在一个列表当中,每个元素的有效性应该由它本身的属性决定,而不与前后的元素发生关联


#7

val list = arrayListOf()
for(item in list){
if(item == “a”){
continue//跳过当前元素
}else if(item==“b”){
break//结束循环
}
println(item)
}


京ICP备16022265号-2 Kotlin China 2017 - 2018
本站由腾讯云提供计算服务