Scala:列表中字符的频率

时间:2018-06-29 16:45:03

标签: scala functional-programming

我是一名来自python / java的新手程序员,他试图掌握scala中的函数式编程。 我正在尝试编写一个函数,该函数将接受字符列表并返回其频率列表。例如,List('a','b','a')应该返回List(('a',2),('b',1))。 我是scala和tail递归的新手,所以请不要以为是先验知识:)这就是我的经验:

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 :(得分:1)

List是不可变的,因此

(head, freq) :: list

在列表的前面创建一个List的新(head, freq)(因为List是不可变的,但是将新列表的尾部作为与该对象相同的对象是安全的list)。由于您没有将新列表分配给任何内容,因此该行也可能不会发生。

类似的东西:

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

将导致该列表在loop中建立。

答案 1 :(得分:0)

虽然接受的答案足以回答问题;一些额外的学习方法: 在处理列表项时,您可以/应该利用以下模式匹配

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
}
相关问题