使用Scala在文本中查找单词对的最优雅方法是什么?

Ste*_*fen 1 scala pattern-matching

给出一个单词对列表

val terms = ("word1a", "word1b") :: ("word2a", "word2b") :: ... :: Nil
Run Code Online (Sandbox Code Playgroud)

Scala中最优雅的方法是测试文本中是否至少有一对出现?当测试到达第一场比赛时,测试应该尽快终止.你会如何解决这个问题?

编辑:更确切地说,我想知道一对中的两个单词是否出现在文本中的某个位置(不一定按顺序).如果列表中的一个对的情况如此,则该方法应该返回true.没有必要返回匹配的对,如果多于一对匹配则不重要.

dhg*_*dhg 6

scala> val text = Set("blah1", "word2b", "blah2", "word2a")
text: scala.collection.immutable.Set[java.lang.String] = Set(blah1, word2b, blah2)

scala> terms.exists{case (a,b) => text(a) && text(b)}
res12: Boolean = true
Run Code Online (Sandbox Code Playgroud)

编辑:请注意,使用集合来表示文本中的标记可以使查找contains更加高效.您不希望使用像List这样的顺序.

编辑2:更新了要求的说明!

编辑3:改containsapply在注释每建议

  • 由于`Set`s本身就是函数,你可以将代码进一步压缩为`text(a)&& text(b)`. (2认同)
  • 这使"尽快终止"标准失败 - 您需要将整个文本作为一组读取,这意味着您可以保证一次读取它.然而,它符合优雅标准. (2认同)