Возможные решения:
Строка - это список символов. Группируйте их по идентификатору, который является (x => x), а затем подсчитайте их. Обычно groupBy возвращает карту, которая может быть преобразована в список кортежей toList.
код/не изобретать колесо
def times(s: String) = s.groupBy(identity).mapValues(_.size).toList
times: (s: String)List[(Char, Int)]
Пример
times("explanation")
res1: List[(Char, Int)] = List((e,1), (x,1), (n,2), (t,1), (a,2), (i,1), (l,1), (p,1), (o,1))
код с хвостовой рекурсией/изобретает колесо /, пожалуйста, используйте не обмануть в Coursera Scala Курс
import scala.annotation.tailrec
def myTimes(s: String) : List[(Char,Int)] = {
@tailrec // comiler cheks if really tailrecursive
def timesTail(chars: List[Char], res: List[(Char,Int)]) : List[(Char,Int)] =
chars match {
case Nil => res // we are done when there are no characters left
case char :: rest => {
// otherwise
val newCharCount =
res.
find (_._1 == char). //check if we already have seen the character
map{ case (c,count) => (c,count + 1) }. // if yes, we raise take the old count and raise it by one
getOrElse((char,1)) // otherwise we count one occurrence
// here it gets recursive
timesTail(
rest, // remaining Characters
newCharCount :: res.filterNot(_._1 == char) // add the new count to list, remove old if present
)
}
}
// initial call with empty lsit to start the helper function
timesTail(s.toList,List())
}
Выход, который вам нужен, не является RLE. Кодировка длины пробега - только компактные соседние буквы. Ваш результат просто группирует и подсчитывает количество элементов ввода. Что именно вам нужно? –
Это явно задание. Итак, что вы пробовали? Рекурсивное решение разбивает проблему на подзадачи. Что может быть подзадачей здесь? –