Search code examples
androidkotlinkotlin-android-extensionskotlin-extension

Deep copy of list with objects in Kotlin


I am new to kotlin and I am trying to make a copy of a list of objects.The problem I am having is that when I change items in the new copy, the old list gets changed as well. This is the object:

class ClassA(var title: String?, var list: ArrayList<ClassB>, var selected: Boolean)
class ClassB(val id: Int, val name: String) 

I tried doing this, but it doesn't work:

val oldList:ArrayList<ClassA>


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

Solution

  • That's bacause you are adding all the object references to another list, hence you are not making a proper copy, you have the same elements in two list. If you want diferents list and diferent references, you must clone every object in a new list:

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