我有一个不可变的列表,我需要在其中交换位置.这有什么简单的方法吗?
以下是我的代码:
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)
你只能在中创建一个新列表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)
它不是很优雅,但它会完成这项工作.基本上,我对切片索引列表i
及j
,所以我有5个部分:前列表的前缀i
,i
之间的部分i
和j
排他性的,j
和来之后列表的后缀j
.从那里,它与i
&j
swaped 简单连接.如果你使用列表缓冲区可以更有效,或者如果你将使用可变的Array
s 更高效...
归档时间: |
|
查看次数: |
3586 次 |
最近记录: |