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
相关产品推荐
相关产品推荐

