Для такого рода задач мне нравится писать свой собственный хвост-рекурсивный алгоритм.
def countConsecutiveCharacters(str: String): List[(Char, Int)] = {
@annotation.tailrec
def loop(remaining: List[Char], currentChar: Char, currentCount: Int,
acc: List[(Char, Int)]): List[(Char, Int)] =
remaining match {
case char :: xs if(char == currentChar) =>
loop(
remaining = xs,
currentChar,
currentCount + 1,
acc
)
case char :: xs =>
loop(
remaining = xs,
currentChar = char,
currentCount = 1,
(currentChar -> currentCount) :: acc
)
case Nil =>
((currentChar -> currentCount) :: acc).reverse
}
str.toList match {
case char :: list =>
loop(
remaining = list,
currentChar = char,
currentCount = 1,
acc = List.empty
)
case Nil =>
List.empty
}
}
Вы можете проверить код, работающий здесь .
Вы можете заменить все это одним foldLeft
, но ИМХО, этот способ чище и проще для чтения.