Перечислимый эквивалент Свифта в Котлине - PullRequest
0 голосов
/ 10 октября 2018

В матричном представлении 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

Я могу найти map и reduce эквивалентов вKotlin как flatMap и fold, но не удалось найти для enumerated.

Как мы можем добиться подобного с функциями более высокого порядка в Kotlin?

Ответы [ 2 ]

0 голосов
/ 10 октября 2018

Начиная с этого ввода:

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 (n 2 ) до O (n).

Если вы имеете дело с большими матрицами, было бы полезно уменьшить сложность пространства с O (n).) к O (1), используя fold вместо reduce:

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] }
0 голосов
/ 10 октября 2018

Похоже, вы ищете с индексом

...