我有一个初始字符串(二进制),如下所示:
长度为32的 val mask = "00000000000000000000000000000000"
此外,我有一个位置列表i(0 <= i <= 31),我希望掩码的值为1.
例如List(0,12,30,4)
应该给出以下结果:
mask = "10001000000010000000000000000010"
如何在scala中有效地执行此操作?
谢谢
答案 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)