如何在 Kotlin 中以数组索引作为起点/终点进行反向 for 循环?

问题描述 投票:0回答:6

现在我正在尝试对循环进行反转。反转的简单方法是 for(i in start downTo end)

但是,如果我使用数组作为起点/终点怎么办?

for-loop kotlin reverse
6个回答
65
投票

您可以从最后一个通过将

size - 1
计算为 0 的索引开始循环,如下所示:

for (i in array.size - 1 downTo 0) {
    println(array[i])
}

更简单,使用

lastIndex
扩展属性:

for (i in array.lastIndex downTo 0) {
    println(array[i])
}

或者您可以采用

indices
范围并将其反转:

for (i in array.indices.reversed()) {
    println(array[i])
}

20
投票

除了zsmb13的第一个答案之外,还有一些其他变体。

使用

IntProgression.reversed

for (i in (0..array.lastIndex).reversed())
    println("On index $i the value is ${array[i]}")

或将

withIndex()
reversed()

一起使用
array.withIndex()
        .reversed()
        .forEach{ println("On index ${it.index} the value is ${it.value}")}

或使用 for 循环进行相同的操作:

for (elem in array.withIndex().reversed())
    println("On index ${elem.index} the value is ${elem.value}")

或者如果不需要索引

for (value in array.reversed())
    println(value)

3
投票

kotlin 中一种非常干净的方式:

for (i in array.indices.reversed()) {
    println(array[i])
}

1
投票

把它留在这里以备不时之需

我创建了一个扩展函数:

public inline fun <T> Collection<T>.forEachIndexedReversed(action: (index: Int, T) -> Unit): Unit {
    var index = this.size-1
    for (item in this.reversed()) action(index--, item)
}

0
投票

为了实现性能最佳实施,您可以使用以下方法:

inline fun <T> Array<T>.forEachReverse(action: (T) -> Unit) {
    var index = lastIndex
    while (index >= 0) {
        action(this[index])
        index--
    }
}

它不会创建另一个实例,并且仍然使用经典的 forEach 语法,因此您可以插入替换并且也是内联的。

对于相同的列表:

inline fun <T> List<T>.forEachReverse(action: (T) -> Unit) {
    var index = size - 1
    while (index >= 0) {
        action(this[index])
        index--
    }
}

0
投票
list.reversed().forEachIndexed { index, data ->
    action(data)
}
© www.soinside.com 2019 - 2024. All rights reserved.