Я предполагаю, что оба элемента пары должны появиться в тексте, но не имеет значения, где, и не имеет значения , какая пара появляется.
Я не уверен, что это самый элегантный, но он неплохой, и он довольно быстрый, если вы ожидаете, что текст, вероятно, содержит слова (и, следовательно, вам не нужно читать все это), и если Вы можете создать итератор, который будет выдавать вам слова по одному:
case class WordPair(one: String, two: String) {
private[this] var found_one, found_two = false
def check(s: String): Boolean = {
if (s==one) found_one = true
if (s==two) found_two == true
found_one && found_two
}
def reset {
found_one = false
found_two = false
}
}
val wordpairlist = terms.map { case (w1,w2) => WordPair(w1,w2) }
// May need to wordpairlist.foreach(_.reset) first, if you do this on multiple texts
text.iterator.exists(w => wordpairlist.exists(_.check(w)))
Вы могли бы еще улучшить вещи, поместив все термины в набор, и даже не потрудившись проверить WordPirlist, если только слово из текста не было в этом наборе.
Если вы имеете в виду, что слова должны встречаться по порядку рядом друг с другом, вам следует изменить check
на
def check(s: String) = {
if (found_one && s==two) found_two = true
else if (s==one) { found_one = true; found_two = false }
else found_two = false
found_one && found_two
}