文件读写-全文单词统计

32 阅读2分钟

(一).从文件中读出内容

source.fromFile方法

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

作用:读入一个文件

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

步骤:

  1.  分隔出一个一个的单词。
  2.  建立一个Map,key是单词,value是次数。
  3. 遍历所有的单词,对每个单词来说:
  • 判断单词是否存在,如果存在把对应的key+1;
  • 否则就设置对应的key,且value为1

字符串的split方法

val words = inputString.split("\\W+")  
val wordCountMap = mutable.Map[String, Int]()  
for (word <- words) {  
  if (wordCountMap.contains(word)) {  
    wordCountMap(word) += 1  
  } else {  
    wordCountMap(word) = 1  
  }  
}

\\W+,表示一个非字符。

(三)对Map结果排序

先转成List或者Seq,然后再排序

wordCountMap.toSeq.sortBy(_._2).foreach(str=>{  
      println(s"${str._1}: ${str._2}")  
    })

(四)结果写入

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

import java.io.PrintWriter
object PrintWriterExample {
  def main(args: Array[String]) {
    val writer = new PrintWriter("output.txt")
    writer.write("Hello, Scala PrintWriter!")
    writer.close()
  }}

完整代码如下:

package luwenzhen01
/*
  1.写一个文件
  2.把字符拆分成单词
  3.统计每个单词出现的次数
  4.对结果排序(降序排序)
  5.把结果输出到一个新文件中
 */

object day44 {
  def main(args: Array[String]): Unit = {
    val content = scala.io.Source.fromFile("test.log").mkString
    //val content = "I am studying scala. I like scala."

    //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:翻转
    val wordList=map1.toList.sortBy(_._2).reverse
    wordList.foreach(el => println(el))
    //5.把结果输出到一个新文件中
    val fileWriter = new FileWriter("result.txt")
    wordList.foreach(el => {
      fileWriter.write(s"${el._1} - ${el._2}\n")
    })
    fileWriter.close()
  }
}