String Scala:替换字符串中位置i处的字符

String Scala:替换字符串中位置i处的字符,string,scala,binary,String,Scala,Binary,我有一个初始字符串(二进制),如下所示: 长度为32的val mask=“00000000000000000000” 此外,我有一个位置列表I(0一个简单的方法是使用零元素“掩码”折叠位置,并在给定位置连续更新字符: List(0,12,30,4).foldLeft(mask)((s, i) => s.updated(i, '1')) -Daniel不幸的是,我能想到的最有效的方法与您在任何其他(非函数式)编程语言中的方法相同: val mask = "00000000000000000

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

长度为32的
val mask=“00000000000000000000”


此外,我有一个位置列表I(0一个简单的方法是使用零元素“掩码”折叠位置,并在给定位置连续更新字符:

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

-Daniel

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

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

我知道这并不是你所要求的,但我想知道你为什么要使用字符串。有一种非常有效的数据结构来存储这种类型的信息,称为
位集

如果您使用的是
位集
,那么设置与整数列表对应的位就很简单了

如果需要可变的
位集

scala.collection.mutable.BitSet.empty ++= List(0,12,30,4)
scala.collection.immutable.BitSet.empty ++ List(0,12,30,4)
如果需要不可变的
位集

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

很高兴听到:)我很好奇@Archeg建议的基于“视图”的解决方案是如何执行的。我的解决方案在每次更新时复制整个掩码(此处:4次)。使用视图,写入操作延迟到mkString调用。对于在视图中创建中间对象以及掩码元素的mkString遍历,也会有一些开销。我认为有了视图,内存性能应该更好。但是,垃圾收集器应该删除未使用的掩码副本,而无需付出太多的努力。时间性能取决于字符串副本的效率。这看起来确实很方便!但我必须使用32位长的掩码来执行SimHash算法。