如何在ArrayBuffer的ArrayBuffer中有效地附加ArrayBuffer?

时间:2017-02-14 16:17:36

标签: scala arraybuffer

我正在尝试将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))

这种行为我不清楚,有人可以帮忙吗?

问候。

2 个答案:

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