Правильный способ поменять x элементов в списке - PullRequest
1 голос
/ 31 августа 2010

Я начал изучать язык Scala, и у меня возник вопрос. Как вы думаете, это правильный способ поменять местами первый и последний элементы x в List в функциональном стиле?

def swap(l: List[Any], x: Int) = {
  val l1 = l.take(x)
  val l2 = l.slice(x, l.length - x)
  val l3 = l.takeRight(x)
  l3 ::: l2 ::: l1
}

Неважно, что случилось, если бы х был больше половины длины списка. Мне интересно узнать алгоритм.

Ответы [ 2 ]

9 голосов
/ 31 августа 2010

Этот код правильный и имеет разумный функциональный стиль.Это не самый эффективный способ, так как он должен пройти через список четыре раза, чтобы создать фрагменты l1 - l3.Кроме того, вы, вероятно, хотите сохранить тип, содержащийся в списке, поэтому небольшое улучшение:

def swap[A](l: List[A], x: Int) = {
  val (l1,rest) = l.splitAt(x)
  val (l2,l3) = rest.splitAt(rest.length-x)
  l3 ::: l2 ::: l1
}
2 голосов
/ 31 августа 2010

Я попробовал, и все заработало:

scala> swap(List(1, 2, 3, 4, 5),2)
res0: List[Any] = List(4, 5, 3, 1, 2)

Что-то не так с кодом, который вы сами предоставили?

...