Подобные вопросы, по-видимому, возникают довольно часто, что является хорошим свидетельством того, что метод Rex Kerr groupedWhile
должен быть включен в стандартную библиотеку коллекций.Однако, если вы не хотите копировать / вставлять это в свой проект ...
Мне нравится ваше рекурсивное решение, но оно на самом деле не выводит правильную вещь (например, строки), так что вот как я 'd измените его:
def groupBy(s: String)(f: (Char, Char) => Boolean): List[String] = s match {
case "" => Nil
case x =>
val (same, rest) = x span (i => f(x.head, i))
same :: groupBy(rest)(f)
}
Затем возьмите свою функцию и попробуйте в REPL:
val isD = (x: Char) => "123456789-_ " contains x
groupBy("this is a line with 0123344334343434343434-343 3345")(isD(_) == isD(_))
Результат - List[String]
, что, по-видимому, действительно того, что вы хотели.