kotlin - 为什么只有添加到列表中的最后一个元素存储/打印在 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 吗?或者,在循环执行之后将对象添加到列表中并且只有最后一个元素添加到列表中?
解决方案
那是因为您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)
}
推荐阅读
- python - python 3.8.2 global_argparse
- node.js - 使用 MSSQL Node 时不显示行号错误?
- r - 我如何从 Stargazer 获得一张桌子?
- android - Android UI 测试:Espresso 和 UIAutomator
- ruby - 布尔运算符的问题(和 &&,!不是)
- nginx - 使用 nginx 和 ffmpeg 将 rtmp 流转换为 udp 的最佳方法是什么?
- docker - 将 Dockerfile/docker-compose.yml 转换为可执行文件
- android - 从 CastPlayer 通知 (ExoPlayer) 禁用 Seekbar/Progressbar
- javascript - @angular/pwa 服务人员不在我已经存在的项目上工作
- wordpress - 如何在 WooCommerce 中识别输入字段的元键