在scala中执行循环的替代方法

时间:2017-03-30 09:16:48

标签: scala loops for-loop pattern-matching

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;
        }
    }
}

1 个答案:

答案 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库来改善这一点。