поменять местами элементы по функции области видимости в kotlin - PullRequest
0 голосов
/ 06 августа 2020

Я хочу, чтобы он транспонировал матрицу. Меня так впечатлила функция обмена в kotlin.

var a = 1
var b = 2

a = b.also { b = a }

println(a) // print 2
println(b) // print 1

Теперь я пытаюсь использовать ее в своей функции транспонирования (я обнаружил, что она работает только с матрицей sqaure, но это не в этом дело).

class Matrix(val matrix : Array<DoubleArray>){
    val rowSize = matrix.size
    val colSize = matrix[0].size
}
fun transposeMatrix(matrix: Matrix): Matrix {
    return Matrix(matrix.matrix.mapIndexed { rowindex, row ->
        row.mapIndexed { colindex, element ->
            if (rowindex > colindex) {
                matrix.matrix[colindex][rowindex].also {
                    matrix.matrix[colindex][rowindex] = element
                }  // this one should "swap" two elements
            } else {
                element
            }
        }.toDoubleArray()
    }.toTypedArray())

}

"swap" не работает.

Enter new matrix:
3 6 9
2 5 10
1 1 0.5

3.0 6.0 9.0 
6.0 5.0 10.0 
9.0 10.0 0.5 

Я думаю, что эта часть равна

element = matrix.matrix[colindex][rowindex].also {matrix.matrix[colindex][rowindex] = element}

, что идеально соответствует формату.

Теперь я действительно запутался. В чем разница между двумя кодами? почему мой не работает?

1 Ответ

0 голосов
/ 06 августа 2020

Я нашел ответ.
Забудьте о матрице. Проблема здесь в том, что функция "map" не изменяет саму коллекцию, а создает новую.

Enter new matrix:
3 6 9
2 5 10
1 1 0.5

mapping first row works perfectly
first:
3 6 9
2 5 10
1 1 0.5
mapped:
3 6 9
problem starts with (2,1)(index 1,0)

by if (rowindex > colindex) { matrix.matrix[colindex][rowindex]

mapped:
    3 6 9
    6
and then by "also" func  matrix.matrix[colindex][rowindex] = element 
first:
    3 6 9
    2->2 5 10
    1 1 0.5

и здесь «Swap» не работает .

...