Scala:在String中的位置i替换char

时间:2015-10-11 18:14:23

标签: string scala binary

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

长度为32的

val mask = "00000000000000000000000000000000"

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

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

mask = "10001000000010000000000000000010"

如何在scala中有效地执行此操作?

谢谢

3 个答案:

答案 0 :(得分:6)

一种天真的方法是折叠零元素掩盖&#39;并在给定位置连续更新char:

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

- 丹尼尔

答案 1 :(得分:2)

不幸的是,我能想到的最有效的方法与你在任何其他(非功能性)编程语言中所做的一样:

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

这实际上应该比丹尼尔回答更有效率,但我更喜欢丹尼尔的清晰度。你仍然要求最有效的方式

<强>更新

好吧,我认为这应该或多或少效率和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) 

答案 2 :(得分:1)

我知道这并不是你所要求的 - 但我不得不想知道你为什么要使用String。这是一种非常有效的数据结构,用于存储此类信息,称为BitSet

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

如果你想要一个可变的BitSet

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

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

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