Лучшая практика для смещения последовательности по кругу - PullRequest
18 голосов
/ 16 января 2012

Я должен реализовать своего рода массив, последовательность или список, который поддерживает самый дешевый способ пересылки и обратной обмотки элементов. Смотрите этот пример:

Original sequence: 1 2 3 4 5

Forwarded once: 5 1 2 3 4
Forwarded twice: 4 5 1 2 3

То же самое, но противоположное для обратной обмотки. Какой самый дешевый и самый Scala-стиль способ реализации этого? В Java я мог бы использовать LinkedList, и это было бы здорово ... Однако я не смог найти какой-либо определенный ответ для Scala.

Кроме того, любой элемент должен быть легко заменен индексом, как в LinkedList.

UPDATE:

Для самого быстрого, но не очень идиоматического варианта алгоритма (вы знаете, когда он вам нужен), обратитесь к ответу Петра Пудлака !!!

Ответы [ 11 ]

1 голос
/ 06 мая 2015

Вот одно из возможных решений для последовательностей

class ShiftWarper( seq: Seq[ Int ] ) {
  def shiftLeft: Seq[ Int ] = {
    if ( seq.isEmpty ) {
      seq
    } else {
      seq.tail :+ seq.head
    }
  }
  def shiftRight: Seq[ Int ] = {
    if ( seq.isEmpty ) {
      seq
    } else {
      seq.last +: seq.init
    }
  }
}
implicit def createShiftWarper( seq: Seq[ Int ] ) =
    new ShiftWarper( seq ) 

def shift_n_Times(
  times: Int,
  seq: Seq[ Int ],
  operation: Seq[ Int ] => Seq[ Int ] ): Seq[ Int ] = {
  if ( times > 0 ) {
    shift_n_Times(
      times - 1,
      operation( seq ),
      operation )
  } else {
    seq
  }
} 

val initialSeq = ( 0 to 9 )

( initialSeq shiftLeft ) shiftRight
shift_n_Times(
  5,
  initialSeq,
  initialSeq => new ShiftWarper( initialSeq ).shiftRight )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...