Я начал изучать язык 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 }
Неважно, что случилось, если бы х был больше половины длины списка. Мне интересно узнать алгоритм.
Этот код правильный и имеет разумный функциональный стиль.Это не самый эффективный способ, так как он должен пройти через список четыре раза, чтобы создать фрагменты l1 - l3.Кроме того, вы, вероятно, хотите сохранить тип, содержащийся в списке, поэтому небольшое улучшение:
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 }
Я попробовал, и все заработало:
scala> swap(List(1, 2, 3, 4, 5),2) res0: List[Any] = List(4, 5, 3, 1, 2)
Что-то не так с кодом, который вы сами предоставили?