Array += 的 ArrayBuffer 没有按预期工作

ArrayBuffer of Array += not working as expected

def produced(sol:Array[Int]):Array[Array[Int]]={
  println("hello")
  val buf = scala.collection.mutable.ArrayBuffer.empty[Array[Int]]
  var productAtTime = Array.fill[Int](NumItem)(0)
  var z=0
  while(z<NumPeriod){
    var x =sol(z)
    if(x != -1){
      productAtTime(x)=productAtTime(x)+1
      println(productAtTime.mkString)
      buf+=productAtTime
      var arraybuf= buf.toArray
      println(arraybuf.deep.mkString)
     }
     else{
     buf+=productAtTime
     }
     z+=1
  }
return buf.toArray
}

我正在尝试使用 ArrayBuffer 创建数组。这个 ArrayBuffer 的每个元素都是一个数组。每个元素应该与前一个元素相同,除了最多一个元素应该递增 1。 (如果 sol(z)=-1 则不递增,否则有一个)

因此,对于从 0 到 NumPeriod 的每个 z,我基于前一个创建了一个数组,我想将这个数组附加到我的缓冲区。出于某种原因,追加的数组也会自行替换缓冲区中所有先前的数组。

例如。我得到的打印输出:for sol= (1,1,-1,0,0)

hello
01
Array(0, 1)
02
Array(0, 2)Array(0, 2)
12
Array(1, 2)Array(1, 2)Array(1, 2)Array(1, 2)
22
Array(2, 2)Array(2, 2)Array(2, 2)Array(2, 2)Array(2, 2)

可以看出,必须追加的数组存在,但在 += 期间它还会更改 ArrayBuffer 中的所有先前数组。 我想要这样的东西:

hello
01
Array(0, 1)
02
Array(0, 1)Array(0, 2)
12
Array(0, 1)Array(0, 2)Array(0, 2)Array(1, 2)
22
Array(0, 1)Array(0, 2)Array(0, 2)Array(1, 2)Array(2, 2)

您每次在 Array[Array[Int]] 中引用(指向)相同的 Array[Int],这就是为什么您会看到重复的相同值。您需要在每次迭代时分配一个 新数组 。您可以通过 Array[T].clone:

$ scala
Welcome to Scala 2.11.8 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_91).
Type in expressions for evaluation. Or try :help.

scala> :pa
// Entering paste mode (ctrl-D to finish)

def produced(sol: Array[Int]): Array[Array[Int]] = {
  val NumItem = 2
  val NumPeriod = 5

  println("hello")
  val buf = scala.collection.mutable.ArrayBuffer.empty[Array[Int]]
  var productAtTime: Array[Int] = Array.fill[Int](NumItem)(0)
  var z = 0
  while (z < NumPeriod) {
    val x = sol(z)
    if (x != -1) {
      productAtTime(x) = productAtTime(x) + 1
      println(productAtTime.mkString)
      buf += productAtTime.clone()
      val arraybuf = buf.toArray
      println(arraybuf.deep.mkString)
    }
    else {
      buf += productAtTime.clone()
    }
    z += 1
  }
  buf.toArray
}

// Exiting paste mode, now interpreting.

produced: (sol: Array[Int])Array[Array[Int]]

scala> produced(Array(1, 1, -1, 0, 0))
hello
01
Array(0, 1)
02
Array(0, 1)Array(0, 2)
12
Array(0, 1)Array(0, 2)Array(0, 2)Array(1, 2)
22
Array(0, 1)Array(0, 2)Array(0, 2)Array(1, 2)Array(2, 2)
res1: Array[Array[Int]] = Array(Array(0, 1), Array(0, 2), Array(0, 2), Array(1, 2), Array(2, 2))