Почему у Kotlin Nested Lists такое поведение - PullRequest
0 голосов
/ 31 декабря 2018

Взгляните на этот пример кода

val list = mutableListOf("1", "2", "3")

val listOfLists = mutableListOf(list, list, list)

val firstList = listOfLists[0]     //get reference to *list* variable

firstList[0] = "Hello"            // replace "1" in firstList with "Hello"

print(listOfLists)

Это печатный вывод

[[Hello, 2, 3], [Hello, 2, 3], [Hello, 2, 3]]

Если вы заметили, что listOfLists переменная больше не вызывается в , нооно не обновляется .И обновление происходит не только на первой позиции, оно обновляется на всех позициях.

Мое намерение - просто обновить только переменную firstList.

Почему это происходит и как мне обойти это?

Ответы [ 3 ]

0 голосов
/ 31 декабря 2018

Это объектно-поведенческое поведение ООП.Влияет на все ссылки ...

enter image description here

0 голосов
/ 31 декабря 2018

Проблема

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

Решение

Если вы не хотите, вам нужно создать три независимые копии.из list, например, используя функцию расширения toMutableList():

val list = mutableListOf("1", "2", "3")

val listOfLists = mutableListOf(
    list.toMutableList(),
    list.toMutableList(),
    list.toMutableList()
)

listOfLists.first()[0] = "Hello"

print(listOfLists)

Вывод:

[[Hello, 2, 3], [1, 2, 3], [1, 2, 3]]

0 голосов
/ 31 декабря 2018

Java обрабатывает переменные как ссылки и, следовательно, Kotlin .Таким образом, все ссылки изменяются после обновления.Вам нужно будет поработать с копиями списка, чтобы обеспечить их независимое обновление:

val list = listOf("1", "2", "3")
val listOfLists = mutableListOf(
            list.toMutableList(),
            list.toMutableList(),
            list.toMutableList())

val firstList = listOfLists[0]
firstList[0] = "Hello"
print(listOfLists)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...