首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Kotlin中带有对象的列表的深度复制

Kotlin中带有对象的列表的深度复制
EN

Stack Overflow用户
提问于 2018-07-23 13:32:19
回答 5查看 27.9K关注 0票数 35

我是kotlin的新手,我试图复制一个objects.The列表,我遇到的问题是,当我更改新副本中的项目时,旧列表也会被更改。这就是目标:

代码语言:javascript
运行
复制
class ClassA(var title: String?, var list: ArrayList<ClassB>, var selected: Boolean)
class ClassB(val id: Int, val name: String) 

我试过这样做,但没用:

代码语言:javascript
运行
复制
val oldList:ArrayList<ClassA>


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

回答 5

Stack Overflow用户

回答已采纳

发布于 2018-07-23 13:36:20

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

代码语言:javascript
运行
复制
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)]
票数 50
EN

Stack Overflow用户

发布于 2021-11-04 11:36:19

代码语言:javascript
运行
复制
var oldList: List<ClassA>?

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

票数 6
EN

Stack Overflow用户

发布于 2018-07-23 13:43:59

这与kotlin无关,当您将对象从旧列表添加到新列表时,它会添加对它们的引用(不创建新对象),这意味着它只是将内存中的地址复制到新列表中。

要解决这个问题,您应该为每个对象创建一个新实例。您可以创建一个副本构造函数,例如:

代码语言:javascript
运行
复制
constructor(otherA: ClassA) {
    this.prop1 = otherA.prop1
    this.prop2 = otherA.prop2
    ...
} 

然后将它们逐一添加到新的列表中:

代码语言:javascript
运行
复制
list1.forEach { list2.add(Class(it)) }
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51480079

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档