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

47 阅读2分钟

从文件中读出内容

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

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

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

作用:读入一个文件

package words

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


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

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



  }

}

image.png

写拆分单词统计个数

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

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

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

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

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

package words

object words1 {
  def main(args: Array[String]): Unit = {
    //1.读入text.txt的内容  大大的长长的字符串
//    Source.formFile().mkString
    //2.对字符串进行拆分:使用split空格,对这个长长的字符串做拆分,得到了一个数组,每个元素都是一个单词
//    split


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


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

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

//      println(word,map.contains(word))
    })

  map.foreach(println)

  }
}

image.png

对Map结果排序

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

package words

import java.io.FileWriter

object words1 {
  def main(args: Array[String]): Unit = {
    //1.读入text.txt的内容  大大的长长的字符串
//    Source.formFile().mkString
    //2.对字符串进行拆分:使用split空格,对这个长长的字符串做拆分,得到了一个数组,每个元素都是一个单词
//    split


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


    //对字符串进行拆分:
    val rst=content.split("\W+").map(ele=>ele.toLowerCase)
    //["I","like","scala"]

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

//      println(word,map.contains(word))
    })

//  map.foreach(println)

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


    val writer=new FileWriter("result.txt")
    woedLists.foreach(ele=>{
      writer.write(s"${ele._1}:${ele._2} \n")
    })
    writer.close()
//    map.toList.sortBy(_._2).reverse.foreach(ele=>{
//      println(ele._1,ele._2)
//    })


  }
}