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)
我有一个初始字符串(二进制),如下所示:
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)