我试图将ArrayBuffer添加到ArrayBuffer of 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))
这个行为对我来说不清楚,有人能帮忙吗?
致以问候。
发布于 2017-02-14 21:52:32
在主arraybuffer.since中重复附加相同的arraybufferint实例--数组缓冲区在最后打印时是可变的--它显示了与您对它的所有使用相一致的属性。Clear()清除内容,但不释放隐藏在引用后面的内存跨度。您可能应该在循环本身中重新创建一个新的数组缓冲区,或者更好的方法是使用一个新的不可变向量,而不是数组缓冲区。
发布于 2017-02-14 19:37:55
逐步遍历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大小相同),然后丢弃您刚刚构建的缓冲区。我假设这只是一个更大、更有用的东西的大致轮廓。
https://stackoverflow.com/questions/42231107
复制相似问题