在List中交换x元素的正确方法

时间:2010-08-31 12:24:24

标签: list scala swap

我开始学习Scala语言,我有一个问题。您如何看待,这是一种以功能样式交换List中的第一个和最后一个x元素的正确方法吗?

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
}

如果x超过列表长度的一半,那么发生了什么并不重要。我很想找出算法。

2 个答案:

答案 0 :(得分:9)

此代码是正确的,并且具有合理的功能样式。它不是最有效的,因为它必须遍历列表四次才能创建l1l3的部分。此外,您可能希望保留列表包含的类型,因此稍有改进:

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
}

答案 1 :(得分:2)

我尝试了它并且工作正常:

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

您自己提供的代码有什么问题吗?