Котлин: Элегантный способ суммировать элементы в строках матрицы? - PullRequest
0 голосов
/ 05 февраля 2019

Учитывая ArrayList (строки) из ArrayList (элементы в строке), есть лучший способ получить список сумм, таких как (row[0][0] + row[1][0] + .... row[n][0]) кроме написания цикла "for"?

Ответы [ 2 ]

0 голосов
/ 05 февраля 2019

Вы можете использовать sum и sumBy для достижения этого.

Ниже приведены 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 (т. Е. Номера его столбцов 0, 1, ..., до nCols), а затем вы map эти индексы к соответствующим colSum() результатам.Возможно, это не самый эффективный способ, но он вполне читабелен.

0 голосов
/ 05 февраля 2019
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
...