android - Kotlin中带有对象的列表的深拷贝

标签 android kotlin kotlin-android-extensions kotlin-extension

我是 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)

最佳答案

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

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)]

关于android - Kotlin中带有对象的列表的深拷贝,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51480079/

相关文章:

kotlin - Kotlin是否两次检查null

kotlin - 在Kotlin中使用比较器

android - Kotlin 扩展功能使用 Intent 附加功能启动 Activity

android - 当第二个 Activity 方向改变时 registerForActivityResult 不起作用

android - Kotlin DialogFragment editText 可编辑始终为空

java - asynctask 类未将数据返回到 fragment

java - 为整体 Android 设备设计

kotlin - Kotlin 中用于变量的通配符

java - Android 应用程序中的编码问题 (WebView.LoadData())

java - 从 recyclerView 中选择项目中的一个复选框并取消选择先前选择的复选框