文件读写—全文单词统计

19 阅读1分钟

1.读入一个文件

格式:scala.io.Source.formFile(文件名) 作用:读入一个文件

如果想要直接得到文本文件,使用mkString方法即可。

Source.fromFile().mkString方法

//1.读test.txt
val content = scala.io.Source.fromFile("./test.txt").mkString
println(content)  //I am learning scala. I like scala.

2.对字符串进行拆分

split方法

//2.对test.txt的字符串进行拆分
val rst = content.split(' ')  // 用空格拆分
rst.foreach(println)  // ["I","am","learning",""scala.","I","like","scala."]

3.建立一个空的容器保存键值对数据

1. 拆分字符串后,建立一个Mapkey是单词,value是次数

2. 遍历所有的单词,对每个单词来说:判断单词是否存在,如果存在把对应的key+1;否则就设置对应的key,且value为1

val map = scala.collection.mutable.Map[String,Int]()
rst.foreach(word => {
  // 如果word在map中存在,值+1
  if(map.contains(word)){
    map(word) += 1
  }
  else {      // 如果word在map中不存在,就把值设为1
    map(word) = 1
  }
})

//打印统计结果
map.foreach(println)

4.按照单词出现的频率,从高到低排序

val wordList = map.toList.sortBy(_._2).reverse

5.把结果写入到文件中

val writer = new FileWriter("result.txt")
wordList.foreach(ele=>{
  writer.write(s"${ele._1}:${ele._2} \n")
})
writer.close()

//6.打印统计结果
 map.foreach(println)

优化代码

val rst = content.split("\W+").map(ele=>ele.toLowerCase)
// \W+ 正则表达式,W表达一个非字符(空格,符号...)  +表示一个及以上
// map 把每个单词变小写

完整代码

import java.io.FileWriter

object words01 {
  def main(args: Array[String]): Unit = {
    //1.读test.txt
    val content = scala.io.Source.fromFile("./test.txt").mkString
    println(content)  // I am learning scala. I like scala.

    //2.对字符串进行拆分
    val rst = content.split("\W+").map(ele=>ele.toLowerCase)
   
    //3.空的容器保存键值对数据:键:单词,值;次数
    val map = scala.collection.mutable.Map[String,Int]()
    rst.foreach(word => {
      if(map.contains(word)){
        map(word) += 1
      }
      else {      
        map(word) = 1
      }
    })

    //4.按照单词出现的频率,从高到低排序
    val wordList = map.toList.sortBy(_._2).reverse

    //5.把结果写入到文件中
    val writer = new FileWriter("result.txt")
    wordList.foreach(ele=>{
      writer.write(s"${ele._1}:${ele._2} \n")
    })
    writer.close()

    //6.打印统计结果
     map.foreach(println)
  }
}