Операция с массивом в Kotlin - PullRequest
0 голосов
/ 05 мая 2020

Вопрос, который я хочу задать, касается вопроса о программировании в kotlin. Этот вопрос может показаться действительно плохим, но я не могу думать, как справиться с этой ситуацией.

val array = ArrayList<ArrayList<Int>>()

val subAnswer = ArrayList<Int>()
subAnswer.add(1)
subAnswer.add(2)
subAnswer.add(3)

array.add(subAnswer)
subAnswer.clear()

Если я распечатал массив, он будет пустым. Я ожидал, что subAnswer очищен, но массив будет содержать [[1,2,3]]. Я хочу знать, почему. Разве он не должен содержать [[1,2,3]]? Почему очистка subAnswer очистила и массив? И как это можно решить?

Я думал, что объект был скопирован и добавлен в массив, поэтому добавленный объект в массив и subAnswer не использует один и тот же адрес памяти. В этом случае кажется, что добавленный объект - это просто ссылка на subAnswer, поэтому очистка subAnswer также может повлиять на массив.

Если я хочу получить ожидаемое поведение, как я могу это сделать? Если есть блоги по этой проблеме, связанные с концепцией программирования, пожалуйста, дайте мне знать. Спасибо.

1 Ответ

1 голос
/ 05 мая 2020

Сначала вы добавили ссылку на массив, содержащийся в subAnswer, в массив переменных, а затем очистили значения в этой ссылке.

Поскольку они были одной и той же ссылкой в ​​куче, изменение ее из одной переменной изменяет это.

Чтобы сохранить список, вы можете сделать его дубликат,

array.add(ArrayList(subAnswer)) // <- creates a new ArrayList with elements from subAnswer
subAnswer.clear()

PS: Использование ArrayList напрямую не является рекомендуемым стилем в Kotlin, вам следует используйте вместо этого MutableList.

val list = mutableListOf<List<Int>>() // or use MutableList instead if you like too use

val subAnswer = mutableListOf<Int>()
subAnswer.add(1)
subAnswer.add(2)
subAnswer.add(3)

list.add(subAnswer.toList()) // copies and create new list, or use toMutableList to create a mutable list
subAnswer.clear()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...