Array + =的ArrayBuffer未按预期工作

时间:2016-11-28 10:17:54

标签: arrays scala arraybuffer

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,我根据前一个创建一个数组,并且我想将此数组附加到我的缓冲区。由于某种原因,附加的数组本身也会替换缓冲区中的所有先前数组。

离。我得到的印刷品的输出:对于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)

1 个答案:

答案 0 :(得分:4)

您每次在Array[Int]内引用(指向)相同的Array[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))