Вы не указали желаемое поведение, если есть несколько повторяющихся последовательностей одного и того же символа.Предполагая, что вам нужна только самая длинная повторяющаяся последовательность, следующий код будет хорошей отправной точкой:
def rec(list : List[Char]) : Map[Char, Int] = {
@scala.annotation.tailrec
def helper(prev: Char, li : List[Char], len : Int, result : Map[Char, Int]) : Map[Char,Int] = {
if(li.isEmpty) {
if(!result.contains(prev)) result + (prev -> len)
else if(result(prev) < len) result + (prev -> len)
else result
}
else {
val cur = li.head
if(cur != prev) {
if(result.contains(prev)) {
if(result(prev) < len)
helper(li.head, li.tail, 1, result + (prev -> len))
else
helper(li.head, li.tail, 1, result)
} else {
helper(li.head, li.tail, 1, result + (prev -> len))
}
} else {
helper(li.head, li.tail, len + 1, result)
}
}
}
helper('\0', list, 0, Map.empty[Char, Int]) - '\0'
}
Запуск
rec(List('c', 'a', 'a', 'a', 'c', 'd' ,'c', 'c' , 'a', 'a', 'd', 'd', 'd', 'd','c','c','a', 'c','c','c'))
Вывод:
res0: Map[Char,Int] = Map(c -> 3, a -> 3, d -> 4)
Идея состоит в том, чтобы просто посмотреть на текущий символ в списке и предыдущий символ.Когда символ изменяется, счетчик последовательности останавливается и текущая длина сравнивается с тем, что хранится на карте.Это довольно просто, если подумать.
Я думаю, что это можно написать более элегантно.Но это может быть хорошей отправной точкой.