在Kotlin中具有对象的列表的深层副本

Oya*_*Oya 7 android kotlin kotlin-extension kotlin-android-extensions

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

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

我尝试这样做,但是不起作用:

val oldList:ArrayList<ClassA>


val newList :ArrayList<ClassA> = ArrayList()
newList.addAll(oldList)
Run Code Online (Sandbox Code Playgroud)

小智 13

var oldList: List<ClassA>?

val newList = oldList.map { it.copy() }
Run Code Online (Sandbox Code Playgroud)


Dam*_*ero 9

那是因为您要将所有对象引用添加到另一个列表,因此您没有进行适当的复制,因此两个列表中的元素相同。如果要使用不同列表和不同引用,则必须在新列表中克隆每个对象:

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)]
Run Code Online (Sandbox Code Playgroud)

  • @IgorGanapolsky 这只会深度复制已知的类成员。甚至这个答案也有一个流程。`List` 中的所有对象都是“深度复制”,但 `List` 引用本身不是。“List”仍然指向相同的内存位置,只是其内容已更改。如果您向类中添加另一个列表,并且忘记将此处提到的相同步骤应用于新的“列表”,您仍然会感到头疼。所以不,这不是通用的*深度复制*解决方案,只是针对特定用例的解决方案(解决方法) (3认同)