Scala字符频次统计函数运行报NoSuchElementException问题求助
问题原因
- 你的模式匹配写法存在结构性错误:
match表达式的返回值没有被作为函数返回值,匹配到Nil返回acc后,代码依然会向下执行后续的if判断逻辑,此时空列表调用charList.head会直接触发NoSuchElementException。 - 你写的
case _分支没有任何逻辑,等于模式匹配完全没有起到终止递归的作用,空列表的边界场景没有被正确拦截。
修正后可运行代码
def times(chars: List[Char]): List[(Char, Int)] = { // 尾递归实现 def timesAcc(charList: List[Char], acc: List[(Char, Int)]): List[(Char, Int)] = { charList match { // 空列表直接返回累加结果,终止递归 case Nil => acc case head :: tail => if (!acc.exists(elem => elem._1 == head)) { // 统计当前字符在剩余列表中的总出现次数 val count = charList.count(c => c == head) // 剩余列表跳过所有已统计的当前字符,减少递归次数 timesAcc(charList.filter(_ != head), (head, count) :: acc) } else { // 当前字符已统计过,直接处理剩余字符 timesAcc(tail, acc) } } } timesAcc(chars, List()) }
补充说明
如果需要统计结果按照字符首次出现的顺序排列,可以在最终返回结果时调用reverse方法反转累加器,因为上述实现采用头插法写入统计结果,默认是倒序排列。
内容的提问来源于stack exchange,提问作者Cameron Burley
相关产品推荐
相关产品推荐

