如何剪切与句子集合相匹配的单词?

时间:2015-04-17 13:51:38

标签: scala

我有一个关于Scala部分字符串匹配的快速问题。考虑一下这个例子:

val s1 = "game of thrones"
val s2 = Array("thrones videos", "watch game", "game of thrones stuff")

我想做某种正则表达式或匹配或contains这样结果应该是这样的:

Array("videos", "watch", "stuff")

删除s1中重复的字符串中的任何单词。什么是最有效的方式?

我目前正在通过将s1转换为正则表达式并将其应用于s2的每一行来实现此目的,但我也无法将其运行。

2 个答案:

答案 0 :(得分:3)

使用splitcontainsmapfilter可以实现这一点。关键是首先使用split

构建您要过滤的单词列表
val s1Words = s1.split(" ")

现在,对于s2中的每个字符串,您希望同样使用split,过滤掉s1Words中出现的字词,然后将其转换回字符串:

s2.map(_.split(" ").filterNot(s1Words.contains).mkString(" "))

您也可以将s1Words转换为一个集合,然后使用apply上的Set方法来测试包含:

val s1Words = s1.split(" ").toSet
s2.map(_.split(" ").filterNot(s1Words).mkString(" "))

如果s2中的单词是由空格以外的一组字符分隔,您可能更喜欢使用正则表达式,以便您可以捕获分隔符,然后在调用mkString时替换它。

答案 1 :(得分:2)

不确定是最有效的'这样做的方式(取决于你的效率),但我们走了:

 val ss1 = s1.split("\\s").toSet  //make a set of the words you have
 //ss1: Array[String] = Array(game, of, thrones)

 val ss2 = s2.map(_.split("\\s").toSet -- ss1).flatten  //make a set of words and remove the ones in ss1
 // Array[String] = Array(throne, videos, watch, stuff)