SCALA中的模式匹配
我有2个列表,其中一个包含20k个元素,另一个包含200k个元素。 我正在执行模式匹配,其中每个list_1元素在list_2中匹配。我写了一个FOR循环,给出了正确的答案,但完成执行需要2个多小时。
还有其他替代方法可以执行此任务吗?我怎样才能加快这个过程?
代码:
import scala.collection.mutable.ListBuffer
var list_x = new ListBuffer[Int]();
var list_y = new ListBuffer[Int]();
for( a <- 1 to list_1.length-1){
println(a);
if(list_1(a).length > 4){ // if the string in a specific row contains > 4 characters
val pat = list_1(a).replace("[","").replace("]","");
val temp = list_2.map(x=> pat.r.findAllIn(x.toString).toList.length).indexOf(1);
if(temp > 0){
list_x+=a;
list_y+=temp;
}
}
}
答案 0 :(得分:1)
这是一种更加scala-fashioned方式:
val findInList = for {
(pat, index) <- list_1.zipWithIndex
if pat.length > 4
rexp = pat.replace("[","").replace("]","").r
pos = list_2.indexWhere {
rexp.findFirstIn(_).nonEmpty
}
if pos != -1
} yield (index, pos)
val (list_x, list_y) = findInList.unzip
注意:我假设至少有一个(1+)匹配是可以接受的,并且您不需要收集不匹配的pos != -1
而不是!=0
。
也许我们可以通过了解您的数据并最终选择不同的regexp
库来改善这一点。