Scala 单词统计案例分步教学

53 阅读1分钟

前置准备

  1. 在项目根目录下创建 “test.txt” 文件,写入内容:“I am studying scala. I like scala.”
  2. 确保 Scala 环境正常(可通过 "cala -version" 验证)

步骤 1:读取文件内容

val content = scala.io.Source.fromFile("成绩统计.txt").getLines()

步骤 2:拆分字符串为单词数组

scala

val list = content.split("\W+");
  • 核心:split("\W+")按正则拆分字符串

    • \W:匹配非单词字符(如 . 、空格)
    • +:匹配 1 个或多个连续的非单词字符
  • 结果:"list" 为数组 "Array(I, am, studying, scala, I, like, scala)"

步骤 3:统计单词出现次数

scala

val map1 = scala.collection.mutable.Map[String, Int]()
list.foreach(word => {
  if (map1.contains(word)) {
    map1(word) += 1
  } else {
    map1(word) = 1
  }
})
  • 核心:用可变'mutable.Map' 动态统计

    • map1.contains(word):判断单词是否已在 Map 中
    • 存在则次数 + 1,不存在则初始化为 1
  • 结果:"map1" 存储 "Map(I -> 2, am -> 1, studying -> 1, scala -> 2, like -> 1)"

步骤 4:对统计结果排序

scala

val wordList = map1.toList.sortBy(_._2).reverse
  • 核心:Map 本身无序,需转为 List 后排序

    • map1.toList:将 Map 转为元组列表 "List((I,2), (am,1), ...)"
    • sortBy(_._2):按元组第二个元素(次数)升序排序
    • reverse:反转列表,变为按次数降序
  • 结果:'wordList' 为 "List((I,2), (scala,2), (am,1), (studying,1), (like,1))"

步骤 5:输出结果到新文件(原代码未实现,按需求补充)

scala

val writer = new java.io.PrintWriter("result.txt")
wordList.foreach { case (word, count) =>
  writer.println(s"$word: $count")
}
writer.close()