scala中文件读写-全文单词统计

27 阅读2分钟

(一)从文件中读出内容

在scala中,涉及到文件读写的方法有很多,可以使用java.io下的工具包,也可以使用scala.io下的功能。

下面介绍source.fromFile这个方法。

格式:scala.io.Source.formFile(文件名)

作用:读入一个文件

(二)写拆分单词统计个数

1. 分隔出一个一个的单词。

2. 建立一个Map,key是单词,value是次数。

3. 遍历所有的单词,对每个单词来说:

判断单词是否存在,如果存在把对应的key+1;

否则就设置对应的key,且value为1

(三)对Map结果排序

Map本身是键值对,它是无序的。可以先转成List或者Seq,然后再排序。

(四)结果写入

使用java.io.PrintWriter写入文件的示例:

整体代码如下:

package words

/*
 * 1. 读入test.txt这个文件,得到一个长长的字符串:"I am studying scala. I like scala.
 *
 * 2. 把这个字符串拆分成一个一个的单词:I, am, studying, scala ......
 *
 * 3. 统计每个单词出现的次数
 *
 * 4. 对结果排序(降序排列)
 *
 * 5. 把结果写出到一个新的文件中
 *
 *
 */

object Main {
  def main(args: Array[String]):Unit= {
    val content = scala.io.Source.fromFile("text.txt").mkString;
    //2. 把字符串拆分为单词
    val list = content.split("\W+").map(word=> word.toLowerCase()) // 使用空格 去拆分字符串,结果是一个List
    //list.foreach(ele => println(ele))

    //3. 统计每个单词出现的次数
    //新建一个map( "I" -> 1 , "am" -> 2)
    val map1 = scala.collection.mutable.Map[String,Int]()
    // 对于list中的每个单词,
    list.foreach(word => {
      // 检查它在Map中是否存在
      println(word, map1.contains(word))
      if(map1.contains(word)) {
        map1(word) += 1
        // 存在:把它的值+1
      }else{
        map1(word) = 1  // 不存在:把它的值设为1
      }
    })

    // 4.对结果排序(降序排列)
    //Map本身是无序的,它没有排序的功能
    //如果要对它的内容进行排序,那我们要把它转换成可以排序的集合:List
    //sortBy 排序:根据元祖的第二个值
    //reverse:翻转
    val wordList = map1.toList.sortBy(_._2).reverse

    ```
// 5. 把结果写出到一个新的文件中
val fileWriter= new  FileWriter("result.txt")
wordList.foreach(el => {
  fileWriter.write(s"${el._1} - ${el._2} \n")
})
fileWriter.close()
  }

}

得到的新的文件如下:

屏幕截图 2025-12-15 160027.png