现在我正在尝试对循环进行反转。反转的简单方法是 for(i in start downTo end)
但是,如果我使用数组作为起点/终点怎么办?
除了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)
kotlin 中一种非常干净的方式:
for (i in array.indices.reversed()) {
println(array[i])
}
把它留在这里以备不时之需
我创建了一个扩展函数:
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)
}
为了实现性能最佳实施,您可以使用以下方法:
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--
}
}
list.reversed().forEachIndexed { index, data ->
action(data)
}