【问题标题】:Kotlin: adding a mutable list into 2D mutable list duplicate it's previous lists to the newly added oneKotlin:将可变列表添加到 2D 可变列表中,将之前的列表复制到新添加的列表中
【发布时间】:2021-09-15 15:21:40
【问题描述】:

我有 2 个可变列表

val line = mutableListOf<String>()
val minesField = mutableListOf<MutableList<String>>()

这两个列表的目的是创建一个由 X 和 0 (9*9) 组成的目录。

我有一个创建line 内容的函数,最后我将它添加到minesField 可变列表中。 我尝试以多种方式添加它,但都以​​相同的结果结束。

       minesField.add(line)
        minesField += line
        minesField.addAll(listOf(line))

发生的情况是我添加到minesField 的最后一个line 将自身复制到之前添加的所有行/列表中。因此,最后,我得到了一个包含 9 个重复行的表格,直到我添加的最后一行。

我认为这不应该发生,因为函数 += .add() 仅为新添加的列表/行创建了一个新索引。它不会在整个列表中重复它...

如何解决?

【问题讨论】:

  • 你是为每一行创建一个新的可变列表还是只重用现有的列表(例如clear)`?
  • 每次我进入创建行的循环,我都会从中清除以前的数据并重新开始......
  • 您能否分享添加这些行的整个代码? (带循环)
  • @Joffrey 好吧,这不是问题,因为它是关于将对象复制到 minesfiled 而不是按原样添加它......

标签: kotlin


【解决方案1】:

我假设您使用完全相同的line 对象重复执行minesField.add(line)

重点是:minesField.add(line) 不会将line 的内容复制到minesField 中。它将line 对象本身添加到其中。如果您随后修改line,您也将修改minesField 的内容。因此,您最终会得到 minesField,其中包含对完全相同的 line 对象的 9 个引用。

您需要为每个新行创建一个新的line 对象,或者您需要在添加到minesField 之前创建一个副本,方法是使用:line.toList()

【讨论】:

    【解决方案2】:

    你说:

    我认为这不应该发生,因为函数 += .add() 仅为新添加的列表/行创建新索引。

    没错。但是,新元素与所有其他元素都指向同一个 line 对象,因为您对所有行都使用了一个对象。所以这个,例如:

    minesField.add(line)
    minesField.add(line)
    

    使minesField 成为对同一列表的两个引用的列表(与line 引用的列表对象相同)。

    让每一行引用一个唯一对象并避免重复的一种方法是每次添加line副本

    minesField.add(line.toMutableList())
    

    【讨论】:

      猜你喜欢
      • 2015-12-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-20
      • 2014-03-18
      • 1970-01-01
      • 1970-01-01
      • 2021-09-25
      相关资源
      最近更新 更多