2017-02-14 2 views
0

ArrayBufferのArrayBufferに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))

この動作は私には不明である、誰でも助けることができますか?

よろしくお願いいたします。

答えて

0

メインの配列バッファに同じarraybuffer [int]インスタンスを繰り返し追加しています。最後に配列バッファを変更すると、配列バッファが変更されているため、作成したすべての用途と一致する属性が表示されます。 Clear()は内容をクリアしますが、参照の背後に隠れるメモリスパンの割り当てを解除しません。おそらく、新しい配列バッファをループ自体の中に新たに作成するか、より良い方法で、配列バッファの代わりに新しい不変のベクトルを使うべきでしょう。

+0

こんにちはレミ、お返事ありがとうございます。あなたは完全に正しいです、ちょうどvarの組み合わせ= ArrayBuffer [Int]()をループに移動して、前の割り当てを取り去ります。これを考慮して、clear()メソッドの使用例は何ですか?よろしく。 –

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と同じサイズである)、そのサイズを返し、その後、あなただけ建てバッファを破棄しているので、これはすべてのかなり無意味です。私は、これがもっと大きくて実際に有用なものの概略であると仮定しています。

+0

こんにちは、jwvh、ご返信ありがとうございます。ご存知のように、このコードはもっと大きなもののサンプルです。私は通常、Vector、Dataset/frames、ml libを使ってSpark for DataScienceパイプラインでScalaを使用しています。とにかく、いくつかのモックと人物の探索を通して、Scalaにもっと深く入ることに決めました。このコードはその一部です。 –

+0

こんにちはjwvh、あなたの返信ありがとう。ご存知のように、このコードはもっと大きなもののサンプルです。私は通常、Vector、Dataset/frames、ml libを使ってSpark for DataScienceパイプラインでScalaを使用しています。とにかくScalaに深く入ることに決めました。このコードはその試行の一部です。あなたの答えを頼りにする質問があります:あなたはvalとして組み合わせを設定しますが、動的に情報を割り当てます。 uderstood valを使用して不変の値を設定しました。宣言と割り当てがループ内で行われないようにvalサイズを設定することを期待していたでしょうか。私は不変構造の使用について間違って何を理解しましたか? –

+0

'' combination''は '' val''を1つの 'ArrayBuffer'を参照し("点 "/"含む ")、決して変更しないので' val'が適切です。 'ArrayBuffer'自体は変更可能であり、その内容は時間とともに変化する可能性があります。変更可能なデータを扱うときは、変更可能なデータ構造を参照する 'val'か不変なデータ構造を参照する' var'のどちらかを選択する必要があります。たとえば、 '5'は不変の' Int'であり、他の何かになることはできませんが 'var x = 5'は' x'が違う 'Int'を参照するように変更できることを意味します。あなたは、varを使って変更可能な変数を参照することはめったにありません。 – jwvh

関連する問題