文件读写-全文单词统计

50 阅读2分钟

(一)任务分析

  1. 把文字内容从.txt文件中读到内存中。

  2. 写程序分析数据。

  3. 把结果写入.txt文件。

【思路】

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

创建的文件:

image.png

(二)具体代码

package words

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

object words01 {
  def main(args: Array[String]): Unit = {
    val content = scala.io.Source.fromFile("test.txt").mkString

    // 2. 把字符串拆分为单词
    val list = content.split("\W+").map(word=>word.toLowerCase)
    // 使用空格去拆分字符串,结果是一个list
    //  \W表示一个非字符(!, . , ? , 空格)
    //  + 一个或者多个


    // 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

    map1.foreach(el => println(el))
  }
}

【运行结果】 image.png

代码如下】最后一步:把结果输出到一个新的文件中

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

write:不会自动换行,可以加入\n; println:写入一行

【运行结果】 image.png