Как получить столбцы двухмерного массива с использованием функционального стиля в kotlin - PullRequest
3 голосов
/ 19 июня 2020

Например, у меня есть такая простая задача: подсчитать все r aws и столбцы, которые имеют все нули в 2D-массиве. Итак, для

0 0 0
0 0 0
1 0 1

ответ будет 2 r aws и 1 столбец. Я могу сделать это так же для r aws: var cntRaws = a.count { it.all { el -> el == 0 } }, но как решить это для столбцов таким же образом?

Ответы [ 2 ]

2 голосов
/ 19 июня 2020

Я не мог придумать какой-либо idomati c / функциональный стиль, чтобы сделать это, но мне пришла в голову идея просто создать лениво вычисляемую функцию подкачки, которая меняет столбцы со строками, когда она хочет вытащить, не создавая новую list.

fun <T> List<List<T>>.swapped() = sequence {
    var index = 0
    while (index < size) {
        yield(map { it[index] })
        index++
    }
}

fun main() {
    val list = listOf(
        listOf(0, 0, 0),
        listOf(0, 0, 0),
        listOf(1, 0, 1)
    )

    val cntRows = list.count { it.all { el -> el == 0 } }
    val cntCols = list.swapped().count { it.all { el -> el == 0 } }

    println("cntRows: $cntRows")
    println("cntCols: $cntCols")
}

Я изо всех сил старался оптимизировать его и делал это за те же шаги O (n * m), что и при обычном подсчете строк, так как последовательности лениво вычисляются .

1 голос
/ 19 июня 2020
val x = Array<IntArray>(3) { IntArray(3) { 0 } }

x[2][0] = 1
x[2][2] = 1
val raws = x.count { it.sum() == 0 }
val columns = (x.indices)
    .map { columnIndex -> x.map { it[columnIndex] } }
    .count { it.sum() == 0 }

println("total raws:$raws")
println("total col:$columns")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...