如何使用 Scala 为给定的二进制字符串有效地获取 1s 的索引?
How to effectively get indices of 1s for given binary string using Scala?
假设我们有一个二进制字符串,例如10010010
.
我想要的只是一个返回该字符串 1
s 索引的函数:
indicesOfOnes("10010010") -> List(0, 3, 6)
indicesOfOnes("0") -> List()
而我实现的是:
def indicesOfOnes(bs: String): List[Int] = {
val lb = ListBuffer[Int]()
bs.zipWithIndex.foreach { case (v, i) =>
if (v == '1') {
lb += i
}
}
lb.toList
}
这行得通,但我认为有更好(更实用)的方法来完成这项工作。任何建议将不胜感激。
您可以使用 filter
然后 map
来获取索引:
scala> val s = "10010010"
s: String = 10010010
scala> s.zipWithIndex.withFilter(_._1 == '1').map(_._2)
res0: scala.collection.immutable.IndexedSeq[Int] = Vector(0, 3, 6)
注意:我使用 withFilter
而不是 filter
以避免创建临时集合。
或者您可以使用 collect
,它在定义它的元素上应用偏函数:
scala> s.zipWithIndex.collect { case (char, index) if char == '1' => index }
res2: scala.collection.immutable.IndexedSeq[Int] = Vector(0, 3, 6)
假设我们有一个二进制字符串,例如10010010
.
我想要的只是一个返回该字符串 1
s 索引的函数:
indicesOfOnes("10010010") -> List(0, 3, 6)
indicesOfOnes("0") -> List()
而我实现的是:
def indicesOfOnes(bs: String): List[Int] = {
val lb = ListBuffer[Int]()
bs.zipWithIndex.foreach { case (v, i) =>
if (v == '1') {
lb += i
}
}
lb.toList
}
这行得通,但我认为有更好(更实用)的方法来完成这项工作。任何建议将不胜感激。
您可以使用 filter
然后 map
来获取索引:
scala> val s = "10010010"
s: String = 10010010
scala> s.zipWithIndex.withFilter(_._1 == '1').map(_._2)
res0: scala.collection.immutable.IndexedSeq[Int] = Vector(0, 3, 6)
注意:我使用 withFilter
而不是 filter
以避免创建临时集合。
或者您可以使用 collect
,它在定义它的元素上应用偏函数:
scala> s.zipWithIndex.collect { case (char, index) if char == '1' => index }
res2: scala.collection.immutable.IndexedSeq[Int] = Vector(0, 3, 6)