用 scala 替换列表中的元素

发布于 2024-10-18 11:32:44 字数 117 浏览 5 评论 0原文

如何用不可变列表按索引替换元素。

例如

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

list.replace(2, 5)

How do you replace an element by index with an immutable List.

E.g.

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

list.replace(2, 5)

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(7

最偏执的依靠 2024-10-25 11:32:44

如果你想替换索引 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

在这两种情况下,你并不是真正的“替换”,而是返回一个包含在那个(那些)位置有不同的元素。

If you want to replace index 2, then

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

If you want to find every place where there's a 2 and put a 5 in instead,

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

In both cases, you're not really "replacing", you're returning a new list that has a different element(s) at that (those) position(s).

终弃我 2024-10-25 11:32:44

除了前面所说的之外,您还可以使用 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)

In addition to what has been said before, you can use patch function that replaces sub-sequences of a sequence:

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)
美胚控场 2024-10-25 11:32:44

您可以使用 list.updated(2,5) (这是 Seq 上的一个方法)。

为此,最好使用 scala.collection.immutable.Vector ,因为更新 Vector 需要(我认为)恒定的时间。

You can use list.updated(2,5) (which is a method on Seq).

It's probably better to use a scala.collection.immutable.Vector for this purpose, becuase updates on Vector take (I think) constant time.

只想待在家 2024-10-25 11:32:44

如果您进行大量此类替换,最好使用可变类或数组。

If you do a lot of such replacements, it is better to use a muttable class or Array.

情话墙 2024-10-25 11:32:44

您可以使用 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)

You can use map to generate a new list , like this :

@ 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)
怪我鬧 2024-10-25 11:32:44

也可以使用 patch 函数来实现,其中

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 是元素的数量从原来的列表中替换掉。

It can also be achieved using patch function as

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)

where 2 is the position where we are looking to add the value, List(27) is the value we are adding to the list and 1 is the number of elements to be replaced from the original list.

瞄了个咪的 2024-10-25 11:32:44

以下是 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)

following is a simple example of String replacement in scala List, you can do similar for other types of data

    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)
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文