You need to enable JavaScript to run this app. Scala字符频次统计函数运行报NoSuchElementException问题求助
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.17 22:36:03