科特林:优雅的方式来总结矩阵跨行元素?

问题描述 投票:1回答:2

鉴于ArrayListArrayList(行)(连续元素),有没有更好的方式来获得,除了写“row[0][0] + row[1][0] + .... row[n][0]”循环像(for)总和的名单?

matrix kotlin functional-programming mapping column-sum
2个回答
4
投票

您可以使用sumsumBy实现这一目标。

以下3种方法:(1)计算整体的矩阵之和,(2)来计算总和对于给定的行,和(3)来计算给定列的总和:

val arr = arrayListOf(
        arrayListOf(1, 2, 3),
        arrayListOf(4, 5, 6),
        arrayListOf(7, 8, 9)
)

fun matrixSum() = arr.sumBy { it.sum() }
fun rowSum(row: Int) = arr[row].sum()
fun colSum(col: Int) = arr.sumBy {row -> row[col] }
// shorter alternative: fun colSum(col: Int) = arr.sumBy { it[col] }

根据你的问题,你想打电话colSum(0)。这将提取row[0](每行的索引0值),总结这些值。

编辑:

关于你的问题在注释部分,以下两种方法:(1)计算所有的行总和,返回一个列表; (2)计算所有山坳款项,返回一个列表。

fun rowSums() = arr.map { it.sum() }
fun colSums() = arr[0].indices.map { col -> colSum(col) }
// shorter alternative:
// fun colSums() = arr[0].indices.map(::colSum)
// another version that does not call colSum:
// fun colSums() = arr[0].indices.map { col -> arr.sumBy { row -> row[col] } }

为了解释colSums(即假设所有行具有相同的列数):首先,你抓你的第一行(arr[0]),那么你得到它的indices(即,它的列数01,...,高达nCols ),然后你map这些指标各自colSum()结果。这可能不是最高效的方式,但它是相当的可读性。


1
投票
val matrix = arrayListOf(
        arrayListOf(1, 2, 3),
        arrayListOf(4, 5, 6),
        arrayListOf(7, 8, 9)
)
val allSum = matrix.sumBy { it.sumBy { it } } // 45
val firstColumnSum = matrix.sumBy { it[0] } // 12
© www.soinside.com 2019 - 2024. All rights reserved.