Kotlin 中包含对象的列表的深层副本
Deep copy of list with objects in Kotlin
我是 kotlin 的新手,我正在尝试制作 objects.The 列表的副本 我遇到的问题是,当我更改新副本中的项目时,旧列表也会更改。这是对象:
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)]
这与 kotlin 无关,当您将旧列表中的对象添加到新列表时,它会添加对它们的引用(不创建新对象),这意味着它只是复制地址内存到新列表。
要解决此问题,您应该为每个对象创建一个新实例。你可以创建一个复制构造函数,例如:
constructor(otherA: ClassA) {
this.prop1 = otherA.prop1
this.prop2 = otherA.prop2
...
}
然后将它们一一添加到新列表中:
list1.forEach { list2.add(Class(it)) }
对迭代对象使用'to'
列表 -> toList()
数组 -> toArray()
ArrayList -> toArray()
MutableList -> toMutableList()
示例:
val array:ArrayList<String> = ArrayList()
array.add("1")
array.add("2")
array.add("3")
array.add("4")
val arrayCopy = array.toArray() // copy array to other array
Log.i("---> array " , array?.count().toString())
Log.i("---> arrayCopy " , arrayCopy?.count().toString())
array.removeAt(0) // remove first item in array
Log.i("---> array after remove" , array?.count().toString())
Log.i("---> arrayCopy after remove" , arrayCopy?.count().toString())
打印日志:
array: 4
arrayCopy: 4
array after remove: 3
arrayCopy after remove: 4
Kotlin 中没有默认函数可以执行此操作。
我已经用完了 Gson。
public data class Person{
val id = 1
val name = ""
public Person copy(){
String stringPerson = new Gson().toJson(this, Person.class);
return new Gson().fromJson(stringPerson, Person.class);
}
}
val persone = Person()
persone.id = 1
person.name = "ABC"
val originalList = ArrayList()
list1.add(persone)
val copiedList = originalList.map{it.copy()}
list2.get(0).name = "DEF"
不会更新originaList。
更改只会反映在复制的列表中。
var oldList: List<ClassA>?
val newList = oldList.map { it.copy() }
我是 kotlin 的新手,我正在尝试制作 objects.The 列表的副本 我遇到的问题是,当我更改新副本中的项目时,旧列表也会更改。这是对象:
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)]
这与 kotlin 无关,当您将旧列表中的对象添加到新列表时,它会添加对它们的引用(不创建新对象),这意味着它只是复制地址内存到新列表。
要解决此问题,您应该为每个对象创建一个新实例。你可以创建一个复制构造函数,例如:
constructor(otherA: ClassA) {
this.prop1 = otherA.prop1
this.prop2 = otherA.prop2
...
}
然后将它们一一添加到新列表中:
list1.forEach { list2.add(Class(it)) }
对迭代对象使用'to'
列表 -> toList()
数组 -> toArray()
ArrayList -> toArray()
MutableList -> toMutableList()
示例:
val array:ArrayList<String> = ArrayList()
array.add("1")
array.add("2")
array.add("3")
array.add("4")
val arrayCopy = array.toArray() // copy array to other array
Log.i("---> array " , array?.count().toString())
Log.i("---> arrayCopy " , arrayCopy?.count().toString())
array.removeAt(0) // remove first item in array
Log.i("---> array after remove" , array?.count().toString())
Log.i("---> arrayCopy after remove" , arrayCopy?.count().toString())
打印日志:
array: 4
arrayCopy: 4
array after remove: 3
arrayCopy after remove: 4
Kotlin 中没有默认函数可以执行此操作。 我已经用完了 Gson。
public data class Person{
val id = 1
val name = ""
public Person copy(){
String stringPerson = new Gson().toJson(this, Person.class);
return new Gson().fromJson(stringPerson, Person.class);
}
}
val persone = Person()
persone.id = 1
person.name = "ABC"
val originalList = ArrayList()
list1.add(persone)
val copiedList = originalList.map{it.copy()}
list2.get(0).name = "DEF"
不会更新originaList。 更改只会反映在复制的列表中。
var oldList: List<ClassA>?
val newList = oldList.map { it.copy() }