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)
}


#8

不能用when???


#9

这种写法是否符合你的需求

    val a = listOf<Int>(11, 22, 33, 44, 55)
    a.asSequence().forEachIndexed { idx, value ->
        if (idx > 2)
            println("$idx: $value")
    }

#10
        val list = listOf<Int>()

        // 下面的 list.indices 也可以 自定义 
        // 比如 ( 0.. list.size - 1) 或者 (0 until list.size)
        list.indices.forEach { index ->
            if (index == 2) return@forEach 
            // 例: 跳过当前索引为2的条目, 相当于Java 的 continue 

            val item = list[index] 
            // 如果需要操作某个条目, 才调用 list[index]  ( 相当于 list.get(index))

            // do something for item
        }

#11

//使用集合的拓展方法操作
list.forEachWithIndex{index,it->//index为下标,it为当前下标的数据

}
集合的一些操作符:集合操作符


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