如何使用Scala有效地获取给定二进制字符串的1s索引?

phi*_*kim 1 functional-programming scala higher-order-functions

假设我们有一个二进制字符串,如10010010.

我想要的只是一个函数返回1该字符串的s 索引:

indicesOfOnes("10010010") -> List(0, 3, 6)
indicesOfOnes("0") -> List()
Run Code Online (Sandbox Code Playgroud)

我实施的是:

def indicesOfOnes(bs: String): List[Int] = {
  val lb = ListBuffer[Int]()
  bs.zipWithIndex.foreach { case (v, i) =>
    if (v == '1') {
      lb += i
    }
  }
  lb.toList
}
Run Code Online (Sandbox Code Playgroud)

这有效,但我认为有更好的(更多功能)方法来完成这项工作.任何建议将不胜感激.

Mar*_*rth 10

您可以使用a 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)
Run Code Online (Sandbox Code Playgroud)

注意:我正在使用withFilter而不是filter避免创建临时集合.


或者您可以使用collect,它对定义它的元素应用部分函数:

scala> s.zipWithIndex.collect { case (char, index) if char == '1' => index }
res2: scala.collection.immutable.IndexedSeq[Int] = Vector(0, 3, 6)
Run Code Online (Sandbox Code Playgroud)