Scala 如何从句子集合中删除匹配的单词?

Scala 如何从句子集合中删除匹配的单词?,scala,Scala,我有一个关于Scala部分字符串匹配的快速问题。考虑这个例子: val s1 = "game of thrones" val s2 = Array("thrones videos", "watch game", "game of thrones stuff") 我想做一些正则表达式或者匹配,或者包含这样的结果,比如: Array("videos", "watch", "stuff") 其中,在s1中重复的字符串中的任何单词都被切掉。最有效的方法是什么 我目前正在通过将s1转换为正则表达式并将

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

val s1 = "game of thrones"
val s2 = Array("thrones videos", "watch game", "game of thrones stuff")
我想做一些正则表达式或者匹配,或者包含这样的结果,比如:

Array("videos", "watch", "stuff")
其中,在s1中重复的字符串中的任何单词都被切掉。最有效的方法是什么


我目前正在通过将s1转换为正则表达式并将其应用于s2的每一行来实现这一点,但我也很难让它正常工作。

不确定最“高效”的方式是什么,这取决于您对“高效”的理解,但我们来看看:

 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)

不确定最“高效”的方法是什么,这取决于您对“高效”的理解,但我们来看看:

 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)
这可以通过使用拆分、包含、映射和筛选来实现。关键是首先使用“拆分”建立要筛选的单词列表:

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

s2.map(_.split(" ").filterNot(s1Words.contains).mkString(" "))
您还可以将s1Words转换为一个集合,然后在集合上使用apply方法,该方法测试包含性:

val s1Words = s1.split(" ").toSet
s2.map(_.split(" ").filterNot(s1Words).mkString(" "))
如果s2中的单词是由一组字符(而不是空格)分隔的,那么您可能更喜欢使用正则表达式,以便捕获分隔符,然后在调用mkString时替换它

这可以通过使用拆分、包含、映射和筛选来实现。关键是首先使用“拆分”建立要筛选的单词列表:

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

s2.map(_.split(" ").filterNot(s1Words.contains).mkString(" "))
您还可以将s1Words转换为一个集合,然后在集合上使用apply方法,该方法测试包含性:

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

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

这可能适合OP的需要,但值得一提的是,您可能会丢失s2中单词的顺序,因为集合没有顺序。例如,Set1,2,3,4,5-Set1,2.toList返回List5,3,4,这可能会随着Scala的不同版本或更新后而改变!这可能适合OP的需要,但值得一提的是,您可能会丢失s2中单词的顺序,因为集合没有顺序。例如,Set1,2,3,4,5-Set1,2.toList返回List5,3,4,这可能会随着Scala的不同版本或更新后而改变!