Scala文件读写-全文单词统计

47 阅读2分钟

从文件中读出内容

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

作用:读入一个文件

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

object words01 {
  def main(args: Array[String]): Unit = {
    // 1. 读入text.txt的内容  大大的长长的字符串
    //    Source formFile().mkString
    // 2. 对字符串进行拆分
    //    split

    // 1
    val content = scala.io.Source.fromFile("test.txt").mkString
    println(content)

    // 2.对字符串进行拆分
    val rst = content.split(' ')
    // ["I", "like", "scala"]
    rst.foreach(println)


  }

}

对Map结果排序

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

object words01 {
  def main(args: Array[String]): Unit = {
    // 1. 读入text.txt的内容  大大的长长的字符串
    //    Source formFile().mkString
    // 2. 对字符串进行拆分
    //    split

    // 1
    val content = scala.io.Source.fromFile("test.txt").mkString
    println(content)

    // 2.对字符串进行拆分: 使用split空格,对这个长长的字符串做拆分,得到了一个数组,每个元素都是一个单词
    val rst = content.split(' ')

    // ["I", "am", "learning", "I", "like", "scala"]
    // 投票,画正字

    // 3.空的容器保存键值对数据:键:单词,值:次数
    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(word) = 1
      }
    })

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

    // 按照单词出现的频率,从高到低排序
    // map是无序的,不能做排序
    // list是可以排序的
    map.toList.sortBy(_._2).reverse.foreach(ele =>{
      println(ele._1, ele._2)
    })
  }

结果输入

最后代码:

image.png

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

package words

import java.io.FileWriter

object words01 {
  def main(args: Array[String]): Unit = {
    // 1. 读入text.txt的内容  大大的长长的字符串
    //    Source formFile().mkString
    // 2. 对字符串进行拆分
    //    split

    // 1
    val content = scala.io.Source.fromFile("test.txt").mkString
    println(content)

    // 2.对字符串进行拆分: 使用split空格,对这个长长的字符串做拆分,得到了一个数组,每个元素都是一个单词
    // \W+ 正则表达式, W表示一个非字符(空格,符合,!,;:....)  + 表示一个及以上
    // map 把每个单词
    val rst = content.split("\W+").map(ele => ele.toLowerCase)

    // ["I", "am", "learning", "I", "like", "scala"]
    // 投票,画正字

    // 3.空的容器保存键值对数据:键:单词,值:次数
    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(word) = 1
      }
    })

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

    // 按照单词出现的频率,从高到低排序
    // map是无序的,不能做排序
    // list是可以排序的
    val wordLists = map.toList.sortBy(_._2).reverse

    // 5. 把结果写入到文件中

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

}

image.png