下面是我的代码,它看起来很难看,因为它使用了两个vars。
def patternMatching(pattern: String, genome: String): List[Int] = {
assert(pattern.length < genome.length)
var curr = 0
var r = List[Int]()
while (curr != -1) {
curr = genome.indexOf(pattern, curr)
if (curr != -1) {
r ::= curr
curr += 1
}
}
r.reverse
}你是如何用一种实用的方式写这个的?
发布于 2013-11-08 18:51:56
这是相当曲折的:
0.until(genome.length).filter(genome.startsWith(pattern, _))发布于 2013-11-08 12:18:15
您可以使用来自unfold的scalaz方法,如下所示:
import scalaz._, Scalaz._
def patternIndexes(pattern: String, genome: String) = unfold(0){
genome.indexOf(pattern, _) match {
case -1 => None
case n => (n, n+1).some
}
}用法:
scala> patternIndexes("a", "aba").toList
res0: List[Int] = List(0, 2)发布于 2018-02-23 09:31:38
有一个简单得多的惯用Scala解决方案,它不需要在每个位置显式应用模式或使用第三方库:
def patternMatching(pattern: String, genome: String): List[Int] =
pattern.r.findAllMatchIn(genome).map(_.start).toListhttps://stackoverflow.com/questions/19858630
复制相似问题