Kotlin向二维可变列表添加可变列表时历史条目被覆盖如何解决
核心问题原因
你遇到的是可变对象引用传递导致的内容同步问题:你全程复用了同一个line可变列表实例,minesField中存储的所有条目都是这个实例的引用,而非独立的内容拷贝。因此你每次修改line的内容时,minesField内所有指向该实例的条目都会同步变更,最终所有行都和最后一次修改后的line内容完全一致,该现象和你使用的列表添加方法无关。
解决方案
有两种常用的修复方式,按需选择即可:
方案1:每次生成新行时创建独立的line实例
不要全局复用同一个line对象,将line的初始化逻辑放到每次生成新行的逻辑内:
val minesField = mutableListOf<MutableList<String>>() // 生成9行的循环逻辑 for (i in 0 until 9) { // 每次循环都新建一个空的可变列表存储当前行内容 val line = mutableListOf<String>() // 此处写你生成当前行X/0内容的逻辑 for (j in 0 until 9) { line.add(/*你的行元素生成逻辑*/) } minesField.add(line) }
方案2:添加行时传入当前line的拷贝
如果你出于业务需要必须复用同一个line实例做内容生成,添加到minesField时传入line的独立副本即可:
// toMutableList()会基于当前line的内容生成一个新的独立可变列表 minesField.add(line.toMutableList()) // 其他添加写法同理 minesField += line.toMutableList() minesField.addAll(listOf(line.toMutableList()))
你之前的错误写法逻辑可参考如下示例,便于你定位自己的代码问题:
// 错误:全局复用同一个line实例 val line = mutableListOf<String>() val minesField = mutableListOf<MutableList<String>>() for (i in 0 until 9) { line.clear() // 生成当前行内容逻辑 for (j in 0 until 9) { line.add(/*你的行元素生成逻辑*/) } // 添加的都是同一个实例的引用 minesField.add(line) }
内容的提问来源于stack exchange,提问作者Saher Al-Sous
相关产品推荐
相关产品推荐

