Scala 如何在ArrayBuffer的ArrayBuffer中有效附加ArrayBuffer?
我试图在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
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大小,而不是在循环中完成。我对使用不可变结构的理解有什么错误?我使用了
组合aval
,因为它引用(“指向”/“包含”)单个ArrayBuffer
且永不更改,因此val
是合适的。ArrayBuffer
本身是可变的,因此其内容可以随时间变化。在处理可变数据时,应在引用可变数据结构的val
或引用不可变数据结构的var
之间进行选择e数据结构。例如:5
是一个不可变的Int
,它不能变成其他的东西,但是var x=5
意味着x
可以更改为引用不同的不可变Int
。你很少(永远)想用var引用一个可变的。