我正在尝试将ArrayBuffer附加到ArrayBuffer的ArrayBuffer中,但结果对我来说似乎很奇怪。
def main(args: Array[String]) {
println(initArray(List(1,2,5,20)))
}
def initArray(numbers: List[Int]): Int = {
var combination = ArrayBuffer[Int]()
var combinations = ArrayBuffer[ArrayBuffer[Int]]()
var finishedCombinations = ArrayBuffer[ArrayBuffer[Int]]()
// Init
for (number <- numbers) {
combination.clear()
combination.append(number)
println("combination : "+combination)
combinations.insert(0,combination)
println("combinations : "+combinations)
}
combinations.size
}
我正在获得一个大小为4的ArrayBuffer,但意外的内容是:
期待得到:
组合:ArrayBuffer(ArrayBuffer(1),ArrayBuffer(2),ArrayBuffer(5),ArrayBuffer(20))
但我明白了:
组合:ArrayBuffer(ArrayBuffer(20),ArrayBuffer(20),ArrayBuffer(20),ArrayBuffer(20))
这种行为我不清楚,有人可以帮忙吗?
问候。
答案 0 :(得分:1)
逐步完成List
将每个元素转换为ArrayBuffer[Int]
,然后将每个元素追加到结果缓冲区。
import collection.mutable.ArrayBuffer
def initArray(numbers: List[Int]): Int = {
val combinations = ArrayBuffer[ArrayBuffer[Int]]()
numbers.map(ArrayBuffer() += _).foreach(combinations.append(_))
combinations.size
}
当然,这一切都毫无意义,因为您正在构建缓冲区,返回其大小(与输入List
大小相同),然后丢弃刚构建的缓冲区。我假设这只是一个大而且实际有用的粗略轮廓。
答案 1 :(得分:0)
你反复将相同的arraybuffer [int]实例附加到主arraybuffer.since,因为数组缓冲区在最后打印时是可变的,它显示的属性与你所做的所有用途一致。 Clear()清除内容但不释放隐藏在引用后面的内存范围。你可能应该在循环中重新创建一个新的arraybuffer,或者更好的是,使用一个新的不可变向量而不是一个arraybuffer。