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))
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))