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

Scala 如何在ArrayBuffer的ArrayBuffer中有效附加ArrayBuffer?,scala,arraybuffer,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 = ArrayBuff

我试图在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
 }
def main(参数:数组[字符串]){ println(initArray(列表(1,2,5,20))) } def initArray(编号:List[Int]):Int={ var组合=ArrayBuffer[Int]() 变量组合=ArrayBuffer[ArrayBuffer[Int]]() var finishedcompositions=ArrayBuffer[ArrayBuffer[Int]]() //初始化
对于(number单步执行
列表
将每个元素转换为
数组缓冲[Int]
,然后将每个元素附加到结果缓冲区

import collection.mutable.ArrayBuffer

def initArray(numbers: List[Int]): Int = {
  val combinations = ArrayBuffer[ArrayBuffer[Int]]()
  numbers.map(ArrayBuffer() += _).foreach(combinations.append(_))
  combinations.size
}

当然,这一切都是毫无意义的,因为你正在构建一个缓冲区,返回它的大小(与输入列表的大小相同),然后丢弃你刚刚构建的缓冲区。我假设这只是一个更大和实际有用的东西的粗略轮廓。

你在重复添加相同的arraybuffer[int]由于数组缓冲区在最后打印时是可变的,因此它显示的属性与您对它的所有使用一致。Clear()清除内容,但不释放隐藏在引用后面的内存范围。您可能应该在循环本身中重新创建一个新的arraybuffer,或者更好,使用一个新的不可变向量,而不是arraybuffer。

Hi-remi,感谢您的回复。您完全正确,只是移动了var组合=arraybuffer[Int]()将前面的分配放在循环中,考虑到这一点,clear()的用例是什么方法?问候。嗨,jwvh,谢谢你的回复。正如你所猜测的,这段代码是一个更大的示例:我通常使用带有Spark的Scala用于数据科学管道,带有向量、数据集/帧和ml库。无论如何,我决定通过一些MOOC和个人探索来深入研究Scala。这段代码就是其中的一部分。嗨,jwvh,谢谢你的reply。正如您所猜测的,这段代码是一个更大的示例:我通常使用Scala和Spark for DataScience pipeline,以及向量、数据集/帧和ml库。无论如何,我决定深入研究Scala,这段代码是这一尝试的一部分。我有一个问题重新考虑您的答案:您将组合设置为val,但随后动态分配信息ion进入其中;uderstood val用于设置不可变值。本应使用声明和分配设置val大小,而不是在循环中完成。我对使用不可变结构的理解有什么错误?我使用了
组合
a
val
,因为它引用(“指向”/“包含”)单个
ArrayBuffer
且永不更改,因此
val
是合适的。
ArrayBuffer
本身是可变的,因此其内容可以随时间变化。在处理可变数据时,应在引用可变数据结构的
val
或引用不可变数据结构的
var
之间进行选择e数据结构。例如:
5
是一个不可变的
Int
,它不能变成其他的东西,但是
var x=5
意味着
x
可以更改为引用不同的不可变
Int
。你很少(永远)想用var引用一个可变的。