List中的元素用scalareplace

你如何用索引replace一个元素与不可变列表。

例如

val list = 1 :: 2 ::3 :: 4 :: List() list.replace(2, 5) 

除了之前所说的之外,还可以使用patch函数replace序列的子序列:

 scala> val list = List(1, 2, 3, 4) list: List[Int] = List(1, 2, 3, 4) scala> list.patch(2, Seq(5), 1) // replaces one element of the initial sequence res0: List[Int] = List(1, 2, 5, 4) scala> list.patch(2, Seq(5), 2) // replaces two elements of the initial sequence res1: List[Int] = List(1, 2, 5) scala> list.patch(2, Seq(5), 0) // adds a new element res2: List[Int] = List(1, 2, 5, 3, 4) 

如果你想replace索引2,那么

 list.updated(2,5) // Gives 1 :: 2 :: 5 :: 4 :: Nil 

如果你想find每个有2的地方,而不是5,

 list.map { case 2 => 5; case x => x } // 1 :: 5 :: 3 :: 4 :: Nil 

在这两种情况下,你并不是真正的“replace”,你要返回一个新的列表,在那个(那些)位置有不同的元素。

你可以使用list.updated(2,5) (这是Seq的方法)。

为了这个目的,最好使用scala.collection.immutable.Vector ,因为Vector更新(我认为)是恒定的。

如果你做了很多这样的replace,最好使用可变类或数组。

你可以使用map来生成一个新的列表,如下所示:

 @ list res20: List[Int] = List(1, 2, 3, 4, 4, 5, 4) @ list.map(e => if(e==4) 0 else e) res21: List[Int] = List(1, 2, 3, 0, 0, 5, 0) 

也可以使用补丁函数来实现

 scala> var l = List(11,20,24,31,35) l: List[Int] = List(11, 20, 24, 31, 35) scala> l.patch(2,List(27),1) res35: List[Int] = List(11, 20, 27, 31, 35) 

其中2是我们要添加值的位置, List(27)是我们添加到列表中的值,1是从原始列表中要replace的元素的数量。