类似indexOf的东西,除了我需要找到所有索引。如果存在.indexOf和,lastIndexOf,是否不应该有一个函数来获取所有出现的索引?我找不到。
请注意,该字符串非常大,大约1MB,因此我需要最快的解决方案。
为澄清起见,我需要获取字符串中子字符串出现的所有位置。
例如
var str = "foo bar foo bar"; //the real string is 1MB
var indexes = str.indexOfAll('foo'); //the function I need
console.log(indexes); //should print [0,8];
想到的一件事是在循环循环中使用indexOf,找到第一个单词,在索引处剪切字符串,然后再次使用indexOf,依此类推,直到找不到任何内容。我不确定性能(剪切和重新创建大字符串)。
答案 0 :(得分:2)
简便的解决方案:
import com.twitter.algebird.HyperLogLogMonoid
import com.twitter.algebird.HyperLogLog.int2Bytes
object AlgebirdHLLApp {
def main(args: Array[String]): Unit = {
println("This is the Spark test of the Algebird HyperLogLog application")
val hll = new HyperLogLogMonoid(4)
val data = List(1, 1, 2, 2, 3, 3, 4, 4, 5, 5)
val seqHll = data.map { hll.create(_) }
val sumHll = hll.sum(seqHll)
val approxSizeOf = hll.sizeOf(sumHll)
val actualSize = data.toSet.size
val estimate = approxSizeOf.estimate
println("Actual size: " + actualSize)
println("Estimate size: " + estimate)
}
}
如果您需要高性能的产品,可以查看特定的文本搜索/索引算法,例如Aho–Corasick algorithm或Boyer–Moore string-search algorithm。
是否真的取决于您的用例以及您搜索的文本是更改的还是静态的,并且可以事先进行索引以实现最佳性能。