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