Kotlin二维列表替换元素异常:修改单个元素致全列表变更
问题根源
你现在的代码里,所有行的子列表其实都是同一个MutableList实例。因为初始化循环里printS.add(printS[0])只是把第一个子列表的引用重复添加到外层列表中,并没有创建新的独立列表。所以修改任意一行的元素,其他行都会跟着变化——它们本质上是同一个列表的不同引用而已。
修复代码
把初始化子列表的逻辑改成每次创建新的MutableList,而不是复用第一个列表的引用:
方案一:基于第一个列表创建副本
private val printS: MutableList<MutableList<Char>> = mutableListOf(mutableListOf()) // 初始化第一个子列表 for (i in 1..seat) printS[0].add('S') // 每次添加时创建新的副本,而非复用引用 for (i in 1..row) { printS.add(printS[0].toMutableList()) }
方案二:直接初始化每个子列表(更直观)
如果不想依赖第一个列表的副本,也可以直接循环创建每个子列表:
private val printS: MutableList<MutableList<Char>> = mutableListOf() // 直接创建每一行的子列表 for (i in 1..row + 1) { // 对应原代码的总行数:初始1行 + 循环添加row行 val rowList = mutableListOf<Char>() for (j in 1..seat) { rowList.add('S') } printS.add(rowList) }
这样修改后,执行printS[5][5] = 'B'就只会修改第6行第5列的元素,其他行不会受到影响。
内容的提问来源于stack exchange,提问作者BigBeast DGX
相关产品推荐
相关产品推荐

