首页 > 解决方案 > 为什么只有添加到列表中的最后一个元素存储/打印在 Kotlin 的以下程序中?

问题描述

这里是 Kotlin 初学者。为什么当我遍历列表时只打印列表的最后一个元素?我的代码相当简单。

class Person {

    var personName:String = "Guest"
    var personAge:Int = 20
    var personHobby:String = "Default"
}

fun main()
{
    val obj = Person()
    val listofPeople = mutableListOf<Person>()
    val namesList = arrayOf("ABC", "DEF", "GHI")
    val hobbyList = arrayOf("Swimming", "Reading","Music")


    for (loop in 0..2) {
        obj.personName = namesList[loop%3]
        obj.personHobby = hobbyList[loop%3]
        obj.personAge = loop * 20
        listofPeople.add(obj)
    }
    println("The size of the list is: ${listofPeople.size}")
    println("The details are:")
    for (person in listofPeople)
        println("Name: ${person.personName}, Age: ${person.personAge}, Hobby: ${person.personHobby}")

}

运行上述代码后的输出为:

The size of the list is: 3
The details are:
Name: GHI, Age: 40, Hobby: Music
Name: GHI, Age: 40, Hobby: Music
Name: GHI, Age: 40, Hobby: Music

我对这里发生的事情感到困惑,每次循环运行时都没有添加 obj 吗?或者,在循环执行之后将对象添加到列表中并且只有最后一个元素添加到列表中?

标签: kotlin

解决方案


那是因为您Person在循环中重用对象,并且您的结果列表包含对同一对象的多个引用。要使其工作,您应该val obj = Person()在循环内移动:

for (loop in 0..2) {
    val obj = Person()
    obj.personName = namesList[loop%3]
    obj.personHobby = hobbyList[loop%3]
    obj.personAge = loop * 20
    listofPeople.add(obj)
}

推荐阅读