Котлин. Array of Arrays работает не правильно - PullRequest
0 голосов
/ 27 апреля 2018
fun main(args: Array<String>) {
    val (n, m) = readLine()!!.trim().split(' ')
    val nInt = n.toInt()
    val mInt = m.toInt()
    val blankArr = IntArray(mInt, { _ -> 0 } )
    var arr = Array(nInt, { _ -> blankArr })
    for (a in arr) {
        for (b in a)
            print(b.toString() + ' ')
        println()
    }
    arr[0][0] = 100
    for (a in arr) {
        for (b in a)
            print(b.toString() + ' ')
        println()
    }
}

CONSOLE:

4 4
0 0 0 0 
0 0 0 0 
0 0 0 0 
0 0 0 0 
100 0 0 0 
100 0 0 0 
100 0 0 0 
100 0 0 0 

Что я делаю не так?

Должно было быть 100 в [0,0]. Вместо этого есть целый столбец, заполненный 100

Ответы [ 2 ]

0 голосов
/ 27 апреля 2018

Проблема в том, что вы помещаете одну и ту же ссылку Array в окружающий массив несколько раз с помощью этого кода:

val blankArr = IntArray(mInt, { _ -> 0 } )
var arr = Array(nInt, { _ -> blankArr })

Вам необходимо создать копии blankArr или немного изменить инициализацию:

fun print2DArray(arr: Array<Array<Int>>) {
    arr.forEach {a->
        println(a.joinToString(" ") { it.toString() })
    }
}
//...
val arr = Array(nInt, { _ -> Array(mInt) { 0 } })
arr[0][0] = 100
print2DArray(arr)

Я сделал всю инициализацию массива в одном выражении, которое создает независимые вложенные массивы:

val arr = Array(nInt, { _ -> Array(mInt) { 0 } })
0 голосов
/ 27 апреля 2018

Попробуйте заменить

val blankArr = IntArray(mInt, { _ -> 0 } )
var arr = Array(nInt, { _ -> blankArr })

с

val blankArr = { IntArray(mInt) { _ -> 0 } }
var arr = Array(nInt, { _ -> blankArr() })

или

val blankArr = IntArray(mInt) { _ -> 0 }
var arr = Array(nInt, { _ -> blankArr.copyOf() })

Результат выполнения станет

4 4
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
100 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0 

Вы спросили:

Что я делаю не так?

Ваш двумерный массив на самом деле является "массивом, все элементы которого указывают на один и тот же массив".
Так что сделайте копию исходного массива, чтобы решить вашу проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...