Scala: частота символов в списке - PullRequest
0 голосов
/ 29 июня 2018

Я начинающий программист из Python / Java, который пытается разобраться с функциональным программированием в Scala. Я пытаюсь написать функцию, которая будет принимать список символов и возвращать список их частот. Например, List ('a', 'b', 'a') должен возвращать List (('a', 2), ('b', 1)). Я новичок в рекурсии скалы и хвоста, поэтому, пожалуйста, не предполагайте много предварительных знаний :) Вот что у меня есть:

def times(chars: List[Char]): List[(Char, Int)] = {

  def loop(chars: List[Char], list: List[(Char, Int)]): List[(Char, Int)] =
  {
    if (chars.isEmpty) list
    else
    {
      val head = chars.head
      val freq = chars.count(x=> x == head)
      (head,freq) :: list
      loop(chars.tail.filterNot(x=> x == head),list)
    }
  }
  loop(chars,List())
}

Если я запускаю время (List ('a', 'b', 'a')), я просто получаю пустой список. Любая помощь будет принята с благодарностью!

Ответы [ 2 ]

0 голосов
/ 29 июня 2018

Пока принятый ответ достаточно хорош для вопроса; некоторое дополнение к обучению :: при обработке элементов списка вы можете / должны воспользоваться преимуществами сопоставления с образцом, как показано ниже

def loop(chars:List[Char], list:List[(Char,Int)]):List:[(Char,Int)]= chars match{
case head::tail => val freq = chars.count(x=> x == head)
loop(tail.filterNot(x=> x == head), (head, freq)::list)
case Nil => list
}
0 голосов
/ 29 июня 2018

List является неизменным, поэтому

(head, freq) :: list

создает новый List с (head, freq) в начале этого списка (поскольку List является неизменным, однако, для хвоста нового списка безопасно быть тем же объектом, что и list). Поскольку вы никому не назначаете новый список, эта строка также может не произойти.

Что-то вроде:

val nextList = (head, freq) :: list
loop(chars.tail.filterNot(x => x == head), nextList)

приведет к созданию списка в loop.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...