Перемешивание части ArrayBuffer на месте

Мне нужно перемешать часть ArrayBuffer, желательно на месте, поэтому копии не требуются. Например, если ArrayBuffer имеет 10 элементов, и я хочу перетасовать элементы 3-7:

// 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
  }
}

Я не смог найти ничего о частичном перемешивании ArrayBuffer с помощью Google. Я предполагаю, что мне придется написать свой собственный метод, но при этом я хотел бы предотвратить копирование.

5
задан Nic Foster 5 March 2012 в 19:07
поделиться