You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Scala函数式编程:如何找出文本文件中出现次数最多的单词?

找出文本文件中出现次数最多的单词(Scala实现)

需求说明

找出文本文件中出现次数最多的单词(忽略大小写,仅保留含A-Z、a-z的单词,忽略数字、标点等);若多个单词频次相同,需全部列出并显示次数。例如:出现次数最多的单词是["and", "it", "the"],各出现10次。

现有代码

你已经完成了词频统计和降序排序的部分,代码如下:

val counter: Map[String, Int] = scala.io.Source.fromFile(file).getLines
      .flatMap(_.split("[^-A-Za-z]+")).foldLeft(Map.empty[String, Int]) {
      (count, word) => count + (word.toLowerCase -> (count.getOrElse(word, 0) + 1))
    }
val list = counter.toList.sortBy(_._2).reverse

后续处理逻辑

在现有代码基础上,只需三步就能得到目标结果:

  • 提取最高频次值(利用降序列表的第一个元素)
  • 过滤出所有频次等于最高值的单词
  • 按要求格式输出结果

完整代码(含修正与后续逻辑)

// 词频统计与排序(修正了原代码中getOrElse的key问题)
val counter: Map[String, Int] = scala.io.Source.fromFile(file).getLines
      .flatMap(_.split("[^-A-Za-z]+")).foldLeft(Map.empty[String, Int]) {
      (count, word) => 
        val lowerWord = word.toLowerCase
        count + (lowerWord -> (count.getOrElse(lowerWord, 0) + 1))
    }
val sortedList = counter.toList.sortBy(_._2).reverse

// 处理并输出结果
if (sortedList.isEmpty) {
  println("文件中没有符合要求的单词")
} else {
  val maxFrequency = sortedList.head._2
  val topWords = sortedList.filter(_._2 == maxFrequency).map(_._1)
  println(s"出现次数最多的单词是[${topWords.mkString(", ")}],各出现$maxFrequency次")
}

细节说明

  • 修正了原代码中count.getOrElse(word, 0)的问题:统计时统一转成小写,所以查询Map的key也应该用小写后的单词,避免统计误差
  • 增加了空列表判断:防止文件为空或无有效单词时抛出异常
  • 使用mkString将单词列表转为逗号分隔的字符串,匹配需求示例的输出格式

内容的提问来源于stack exchange,提问作者whoisalex

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 00:25:20