在scala中交换位置列表

Jat*_*tin 3 scala

我有一个不可变的列表,我需要在其中交换位置.这有什么简单的方法吗?

以下是我的代码:

def swap(i:Int, j:Int,li:List[T]):List[T]={
        if(i>=li.size && j >=li.size)
            throw new Error("invalie argument");

        val f = li(i)
        li(i) = li(j) //wont work
        li(j) = f;//wont work
        li;
    }
Run Code Online (Sandbox Code Playgroud)

最初,我尝试将其转换为数组,更改位置,然后再将其转换为List.任何简单的方法?

dre*_*xin 13

这样做很容易(但不是非常有效)

val l = List(1,2,3)
l: List[Int] = List(1, 2, 3)

l.updated(0,l(2)).updated(2,l(0))
res1: List[Int] = List(3, 2, 1)
Run Code Online (Sandbox Code Playgroud)


gil*_*och 5

你只能在中创建一个新列表O(n).您可能想要使用不同的数据结构.你可以这样做:

def swap[T](i:Int, j:Int,li:List[T]):List[T]={
    if(i>=li.size || j >=li.size || i >= j)
         throw new Error("invalid argument")

    li.dropRight(li.length - i) ::: (li(j) :: li.dropRight(li.length - j).drop(i+1)) ::: ((li(i) :: li.drop(j + 1)))
}
Run Code Online (Sandbox Code Playgroud)

它不是很优雅,但它会完成这项工作.基本上,我对切片索引列表ij,所以我有5个部分:前列表的前缀i,i之间的部分ij排他性的,j和来之后列表的后缀j.从那里,它与i&jswaped 简单连接.如果你使用列表缓冲区可以更有效,或者如果你将使用可变的Arrays 更高效...