gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 13:14:17 29 4
gpt4 key购买 nike

因此,我有一个数据类Cars
当我第一次开始 Activity 时,我将创建一个列表并添加一些对象:

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:

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

原始列表(我想复制元素,但不影响此元素):
列表
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
}

}

最佳答案

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(cars.name,cars.options.toMutableList())或类似名称,此处的重点是,对于所有列表中的每个对象,您都需要复制并重新创建列表,或使用一些内置方法(如果可用)进行操作。

关于kotlin - 对一个对象列表所做的更改也会影响另一个列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49625040/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com