Вы можете сделать что-то вроде этого:
def processFile(f: File) {
val src = Source.fromFile(f)
val hit = src.getLines().sliding(3).exists{
case List(l0, l1, l2) => l0.contains(s1) && l2.contains(s1)
case _ => false
}
src.close
// do something depending on hit like adding to a Map
}
Прежде всего вам не нужно преобразовывать в массив, вы можете сохранить итератор для чтения только тех строк, которые необходимы для поиска совпадения.
Вы можете использовать sliding
, чтобы получить производный итератор, используя скользящее окно из 3 строк, где вы ищите строку в строке i
и i+2
.
exists
проверяет, удовлетворяет ли элемент этого скользящего итератора предикату.Для удобства шаблон case
будет соответствовать 3 строкам от элемента скользящего окна до 3 значений. Мне пришлось использовать REPL, чтобы выяснить, какой тип действительно возвращает скольжение .
Наконец, не забудьте закрыть src.
Если вам нужен счетчик вхождений:
val count = src.getLines().sliding(3).filter{
case List(l0, l1, l2) => l0.contains(s1) && l2.contains(s1)
case _ => false
}.size
Вы фильтруете вхождения и затем получаете размер ...
, отредактированный для ошибки совпадения для файлов короче 3 строк