Kotlin 中包含对象的列表的深层副本

新手上路,请多包涵

我是 kotlin 的新手,我正在尝试制作对象列表的副本。我遇到的问题是,当我更改新副本中的项目时,旧列表也会更改。这是对象:

 class ClassA(var title: String?, var list: ArrayList<ClassB>, var selected: Boolean)
class ClassB(val id: Int, val name: String)

我试过这样做,但它不起作用:

 val oldList:ArrayList<ClassA>

val newList :ArrayList<ClassA> = ArrayList()
newList.addAll(oldList)

原文由 Oya 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 394
2 个回答

那是因为您将所有对象引用添加到另一个列表,因此您没有制作正确的副本,两个列表中有相同的元素。如果您想要不同的列表和不同的引用,则必须克隆新列表中的每个对象:

 public data class Person(var n: String)

fun main(args: Array<String>) {
    //creates two instances
    var anna = Person("Anna")
    var Alex =Person("Alex")

    //add to list
    val names = arrayOf(anna , Alex)
    //generate a new real clone list
    val cloneNames = names.map{it.copy()}

    //modify first list
    cloneNames.get(0).n = "Another Anna clone"

    println(names.toList())
    println(cloneNames.toList())
}

[Person(n=Anna), Person(n=Alex)]
[Person(n=Another Anna clone), Person(n=Alex)]

原文由 developer_hatch 发布,翻译遵循 CC BY-SA 4.0 许可协议

var oldList: List<ClassA>?

val newList = oldList.map { it.copy() }

原文由 Yasin Ege 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题