Scala:替换 String 中位置 i 的 char

Scala: replace char at position i in String

我有一个初始字符串(二进制),如下所示:

val mask = "00000000000000000000000000000000" 长度为 32

此外,我有一个位置列表 i (0 <= i <= 31),我希望掩码在这些位置的值为 1。

例如 List(0,12,30,4) 应该给出以下结果:

mask = "10001000000010000000000000000010"

我怎样才能在 scala 中有效地做到这一点?

谢谢

一种天真的方法是折叠具有零元素的位置 'mask' 并连续更新给定位置的字符:

List(0,12,30,4).foldLeft(mask)((s, i) => s.updated(i, '1'))

- 丹尼尔

不幸的是,我能想到的最有效的方法与您使用任何其他(非函数式)编程语言的方法相同:

val mask = "00000000000000000000000000000000"
val l = List(0, 12, 30, 4)
val sb = new StringBuilder(mask)
for (i <- l) { sb(i) = '1' }
println(sb.toString)

这实际上应该比 Daniel 的回答更有效,但由于清晰度,我更喜欢 Daniel 的回答。您仍然要求最有效的方法

已更新

好的,我认为这应该或多或少是高效的和 FP 风格的 - 诀窍是使用视图:

val view : SeqView[Char, Seq[_]] = (mask: Seq[Char]).view
println(List(0,12,30,4).foldLeft(view)((s, i) => s.updated(i, '1')).mkString) 

我知道您问的不是这个,但我想知道您为什么要使用字符串。有一种非常有效的数据结构用于存储此类信息,称为 BitSet.

如果您使用的是 BitSet,那么设置与整数列表对应的位是微不足道的。

如果你想要一个可变的 BitSet:

scala.collection.mutable.BitSet.empty ++= List(0,12,30,4)

如果你想要一个不可变的BitSet:

scala.collection.immutable.BitSet.empty ++ List(0,12,30,4)