对一个对象列表所做的更改也会影响另一个列表

时间:2018-04-03 07:58:38

标签: kotlin

所以,我有一个数据类Cars。 当我第一次开始活动时,我会创建一个列表并添加一些对象:

val listA: ArrayList<Cars> = ArrayList()
listA.add(*API response objects*)

直到我决定创建不同的列表并添加此列表内容(基本上都是副本)时,一切都很好:

val listB: ArrayList<Cars> = ArrayList()
listB.addAll(listA)

然后我决定做一些删除命令,如:

if (imFeelingLucky) listB.removeAt(position)

问题:listB所做的更改也会对listA生效(当我从listA删除项目时,它会自动删除listB中的项目。我错过了什么?为什么会这样?我正在尝试更改列表的“内容”,而不是更改“对象”。怎么避免这个?

CODE:

我有二维列表 - 汽车清单和车内颜色。

原始列表(我想复制元素而不影响这个元素): 的 listA的

List<Cars>:
 Car#1:
      *name_of_car
      *car_colors: List<CarColors> ...
 Car#2:
      *name_of_car
      *car_colors: List<CarColors> ...
 Car#3:
      *name_of_car
      *car_colors: List<CarColors> ...

listC - 包含汽车的颜色。基本上是for-loop

class testA {

    val listA: ArrayList<Cars> = ArrayList()

    init {
        getData()
        changeData()
    }

    private fun getData() {
        listA.add(..getting data and population listA)
    }

    private fun changeData(): List<Cars> {
        val listB: List<Cars> = ArrayList()
        listB.addAll(listA)

        for (carPosition in listC.size - 1 downTo 0) {
            for (carColorPosition in listC[carPosition].size - 1 downTo 0) {
                if (!listC[carPosition][carColorPosition]) {
                    listB[carPosition].options.removeAt(carColorPosition)
                }
            }
        }

        for (itemToRemovePosition in listB.size - 1 downTo 0) {
            if (listB[itemToRemovePosition] == 0) {
                listB.removeAt(itemToRemovePosition)
            }
        }

        return listB
    }

}

1 个答案:

答案 0 :(得分:3)

val listB: List<Cars> = ArrayList()
listB.addAll(listA)

两个列表中是否存在相同Cars对象的浅表副本。你需要的是一份深刻的副本:

How to clone or copy a list in kotlin

Kotlin data class copy method not deep copying all members

如果最糟糕的情况发生,您可以遍历列表并添加新对象: 即对于(listA中的汽车)listB.add(汽车(cars.name,cars.options.toMutableList())或类似的东西,这里重要的一点是,对于所有列表中的每个对象,你需要复制一份它并重新创建列表或使用一些内置方法来执行此操作。