2013-06-03 36 views
0

我有一个问题,这部分代码在斯卡拉如何正确使用折叠留在斯卡拉功能

object Test12 { 
    def times(chars: List[Char]): List[(Char, Int)] = { 
    val sortedChars = chars.sorted 
    sortedChars.foldLeft (List[(Char, Int)]()) ((l, e) => 
     if(l.head._1 == e){ 
      (e, l.head._2 + 1) :: l.tail 
     } else { 
      (e, 1) :: l 
     }) 
    } 

    val s = List('a', 'b') 

    val c = times s 
} 

最后一行给出一个错误:

的方法次缺少参数;按照这个方法用'_”如果你 希望把它当作一个部分应用功能

但是,我不明白为什么,因为我已经给2个参数到最后一个功能 - foldLeft。

在此先感谢您的帮助!

代码的想法是计算每个角色有多少时间出现在给定列表

回答

3

时代的语法是好的,但你需要使用括号调用它时,即:

val c = times(s) 

但它不会工作,因为你使用l.head不检查如果L是零,而一个空的列表没有头。你可以例如与之相匹配的检查为:

def times(chars: List[Char]): List[(Char, Int)] = { 
    val sortedChars = chars.sorted 
    sortedChars.foldLeft (List[(Char, Int)]()) ((a,b) => (a,b) match { 
    case (Nil, e) => (e, 1) :: Nil 
    case ((e, count) :: l, f) => 
     if (e == f) (e, count + 1) :: l 
     else (f, 1) :: (e, count) :: l 
    }) 
} 

虽然更简单的方法是使用更高级别的采集功能:

def times(chars: List[Char]) = chars.groupBy(c=>c).map(x=>(x._1,x._2.length)).toList 
+0

太谢谢你了! :-) – Joggi

1
val c = times s 

您不能调用方法没有这样的支架。试试times(s)this times s