用scala替换List中的元素

时间:2011-02-21 04:51:56

标签: scala replace

如何使用不可变List替换索引元素。

E.g。

val list = 1 :: 2 ::3 :: 4 :: List()

list.replace(2, 5)

7 个答案:

答案 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)