web-dev-qa-db-fra.com

Copie complète de la liste des objets dans Kotlin

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)
4
Oya

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)]
1
Damian Lattenero

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)) }
0
Roi Amiel

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
0
Rasoul Miri