我们说我有两个字符串列表,这两个字符串都很长。我想在列表之间执行正则表达式匹配,使用第一个列表作为匹配器模式,第二个列表作为目标。
示例:
Index List1 List2
0 'abc' '123456'
1 '123' 'abcdefgh'
2 'val' 'down to the valley'
我的输出应以某种形式传达以下信息:
Index 0 of List1 matches with Index 1 of List2
Index 1 of List1 matches with Index 0 of List2
Index 2 of List1 matches with Index 2 of List2
在JVM世界中,有哪些简单匹配的现有技术/库?对于这么简单的事情,OpenNLP似乎有些过分。如果现有的算法经过验证,我也不反对使用我自己的实现。
答案 0 :(得分:2)
val la = Array("abc", "123", "val")
val lb = Array("123456", "abcdefgh","down to the valley")
for {
xa <- la.indices
xb <- lb.indices
if lb(xb).contains(la(xa))
} yield s"index $xa of A matches index $xb of B"
//res0: IndexedSeq[String] = Vector(index 0 of A matches index 1 of B,
// index 1 of A matches index 0 of B,
// index 2 of A matches index 2 of B)
索引List
的效率相当低。 Array
对于那种事情更好。
答案 1 :(得分:1)
这是你会考虑的吗?
val list1 = List("abc", "123", "val").zipWithIndex
val list2 = List("123456", "abcdefgh", "down to the valley").zipWithIndex
val result = list1.map {
case (elmt1, i1) => {
val matching = list2.filter {
case (elmt2, i2) => elmt2.contains(elmt1)
}
"Index " + i1 + " of List1 matches with Index " +
matching.map(_._2).mkString(", ") + " of List2"
}
}
println(result)
它是O(n * m)中的一个天真循环,其中n和m是列表大小。
当列表1的元素不匹配时,这将需要处理副案例(currentlly它会print Index 1 of List1 matches with Index of List2
)。
答案 2 :(得分:0)
来自jwvh的无耻副本:
val la = Array("abc", "123", "val")
val lb = Array("123456", "abcdefgh","down to the valley")
自己的偏好:
la.foreach (a => lb.foreach {b => if (b.matches (s".*$a.*")) println (s"match $a:$b")})
match abc:abcdefgh
match 123:123456
match val:down to the valley
对于更大的数据收集,您可以尝试 .par ,这会将整行转换为并行管道。如果您有大量数据,请进行一些测量并回电给我们。 :)
la.par.foreach (a => lb.foreach {b => if (b.matches (s".*$a.*")) println (s"match $a:$b")})