我开始学习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超过列表长度的一半,那么发生了什么并不重要。我很想找出算法。
答案 0 :(得分:9)
此代码是正确的,并且具有合理的功能样式。它不是最有效的,因为它必须遍历列表四次才能创建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
}
答案 1 :(得分:2)
我尝试了它并且工作正常:
scala> swap(List(1, 2, 3, 4, 5),2)
res0: List[Any] = List(4, 5, 3, 1, 2)
您自己提供的代码有什么问题吗?