Kotlin中的Swift枚举等价物

doinxwow  于 12个月前  发布在  Kotlin
关注(0)|答案(3)|浏览(118)

在一个3x3矩阵表示中,我可以找到Swift中两个对角线与一个线性的和,如下所示,

let array = [
   [1, 2, 3],
   [4, 5, 6],
   [-7, 8, 9]
]
let d1 = array.enumerated().map({ $1[$0] }).reduce(0, +)
let d2 = array.reversed().enumerated().map({ $1[$0] }).reduce(0, +)
print(d1) // prints 15
print(d2) // prints 1

字符串
我能够在Kotlin中找到mapreduce的等价物,如flatMapfold,但找不到enumerated
我们如何在Kotlin中实现类似的高阶函数?

kpbwa7wx

kpbwa7wx1#

从以下输入开始:

val input: Array<Array<Int>> = arrayOf(
        arrayOf(1, 2, 3),
        arrayOf(4, 5, 6),
        arrayOf(-7, 8, 9)
)

字符串
这就是我对对角线和的表述

val mainDiagonalSum = input.indices
        .map { input[it][it] }
        .reduce(Int::plus)
val counterDiagonalSum = input.indices
        .map { input[input.size - 1 - it][it] }
        .reduce(Int::plus)


注意,这是对你的解决方案的一个改进,因为它不需要创建反向数组,它将时间复杂度从O(n2)提高到O(n).
如果你处理的是大型矩阵,那么通过使用fold而不是reduce,将空间复杂度从O(n)降低到O(1)也是值得的:

val mainDiagonalSum = input.indices
        .fold(0) { sum, i -> sum + input[i][i] }
val counterDiagonalSum = input.indices
        .fold(0) { sum, i -> sum + input[input.size - 1 - i][i] }

twh00eeo

twh00eeo3#

这对我来说几乎和Swift的版本一样

fun <T> List<T>.enumerated(): List<Pair<Int, T>> {
    return this.indices.map { Pair(it, this[it]) }
}

字符串

相关问题