Je suis nouveau sur kotlin et j'essaie de copier une liste d'objets. Le problème que je rencontre est que, lorsque je modifie des éléments dans la nouvelle copie, l'ancienne liste est également modifiée. C'est l'objet:
class ClassA(var title: String?, var list: ArrayList<ClassB>, var selected: Boolean)
class ClassB(val id: Int, val name: String)
J'ai essayé de faire ça, mais ça ne marche pas:
val oldList:ArrayList<ClassA>
val newList :ArrayList<ClassA> = ArrayList()
newList.addAll(oldList)
C'est parce que vous ajoutez toutes les références d'objet à une autre liste. Par conséquent, vous ne faites pas une copie correcte, vous avez les mêmes éléments dans deux listes. Si vous voulez différentes listes et différentes références, vous devez cloner chaque objet de la nouvelle liste:
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)]
Ce n'est pas lié à kotlin, lorsque vous ajoutez les objets de l'ancienne liste à la nouvelle, il leur ajoute la référence (pas de création d'un nouvel objet), ce qui signifie simplement copier l'adresse de la mémoire dans la nouvelle liste .
Pour résoudre ce problème, vous devez créer une nouvelle instance pour chaque objet. vous pouvez créer un constructeur de copie, par exemple:
constructor(otherA: ClassA) {
this.prop1 = otherA.prop1
this.prop2 = otherA.prop2
...
}
puis ajoutez-les un à un à la nouvelle liste:
list1.forEach { list2.add(Class(it)) }
Utilisez 'to' pour itérer l'objet
Liste -> toList ()
Tableau -> toArray ()
ArrayList -> toArray ()
MutableList -> toMutableList ()
Exemple:
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())
journal d'impression:
array: 4
arrayCopy: 4
array after remove: 3
arrayCopy after remove: 4