ArrayBufferの一部をシャッフルする必要があります。コピーは不要です。 ArrayBufferは、10個の要素を持っている、と私は要素3-7をシャッフルしたい場合たとえば、:ArrayBufferの一部をシャッフルする
// Unshuffled ArrayBuffer of ints numbered 0-9
0, 1, 2, 3, 4, 5, 6, 7, 8, 9
// Region I want to shuffle is between the pipe symbols (3-7)
0, 1, 2 | 3, 4, 5, 6, 7 | 8, 9
// Example of how it might look after shuffling
0, 1, 2 | 6, 3, 5, 7, 4 | 8, 9
// Leaving us with a partially shuffled ArrayBuffer
0, 1, 2, 6, 3, 5, 7, 4, 8, 9
私は、以下に示すようなものを書いてきたが、それはコピーを必要とし、反復処理すると、数回ループします。これを行うより効率的な方法があるはずです。
def shufflePart(startIndex: Int, endIndex: Int) {
val part: ArrayBuffer[Int] = ArrayBuffer[Int]()
for (i <- startIndex to endIndex) {
part += this.children(i)
}
// Shuffle the part of the array we copied
val shuffled = this.random.shuffle(part)
var count: Int = 0
// Overwrite the part of the array we chose with the shuffled version of it
for (i <- startIndex to endIndex) {
this.children(i) = shuffled(count)
count += 1
}
}
GoogleでArrayBufferを部分的にシャッフルすることについては何も見つかりませんでした。私は自分の方法を書かなければならないと考えていますが、そうすることでコピーを防止したいと思います。
あなたが持っているものを使うと、私はこれを得ます: 'ArrayBuffer(1,2,3,4,5,6,7,8,9); ArrayBuffer(1、2、3、4、5、6、7、8、9); a:scala.collection.mutable.ArrayBuffer [Int] = ArrayBuffer(1、2、3、4、5、6、7、8、9) '。実際には何もシャッフルしていないようです。 –
複数回試してみてください。それは所定の位置にシャッフルしているので、あなたの考え方(実際は単純です)では機能しません。 't._1'と' t._2'を常に交換するのではなく、動いているものが動いて動いているもののいくつかはすでに移動されています。それを気軽に改善してください。 –
私は、それが2回目の呼び出しの後にシャッフルしたことを確認します。唯一の問題は、開始と終了の両方を1ずつ減らす必要があることです。なぜなら、shufflePart(2、7)を使用すると、シャッフルが3-8になるからです。また、 'seq'にshuffleを使うことで、そこにコピーが作成されている可能性がまだあります。たぶん私はコピーの問題を考えすぎています。 –