如何使用不可变List替换索引元素。
E.g。
val list = 1 :: 2 ::3 :: 4 :: List()
list.replace(2, 5)
答案 0 :(得分:83)
如果要替换索引2,则
list.updated(2,5) // Gives 1 :: 2 :: 5 :: 4 :: Nil
如果你想找到每个有2的地方而不是放入5,
list.map { case 2 => 5; case x => x } // 1 :: 5 :: 3 :: 4 :: Nil
在这两种情况下,你并没有真正“替换”,你将返回一个新的列表,该列表在那些(那些)位置具有不同的元素。
答案 1 :(得分:49)
除了之前的说法,您可以使用patch
函数替换序列的子序列:
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)
答案 2 :(得分:8)
您可以使用list.updated(2,5)
(Seq
上的方法)。
为此目的使用scala.collection.immutable.Vector
可能更好,因为Vector
采取(我认为)恒定时间的更新。
答案 3 :(得分:1)
您可以使用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)
答案 4 :(得分:1)
也可以使用补丁功能
来实现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是要从原始列表中替换的元素数。
答案 5 :(得分:0)
如果你做了很多这样的替换,最好使用muttable类或Array。
答案 6 :(得分:0)
以下是scala List中字符串替换的简单示例,您可以对其他类型的数据执行类似的操作
scala> val original: List[String] = List("a","b")
original: List[String] = List(a, b)
scala> val replace = original.map(x => if(x.equals("a")) "c" else x)
replace: List[String] = List(c, b)