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

103 阅读2分钟

一,任务分析

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

  1. 写程序分析数据。

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

4.png

二,从文件中读出内容

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

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

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

作用:读入一个文件

package words
/*
*
* 1,读入test。txt这个文件,得到一个长长的字符串:“I am studying scala.I like scala”
*
* 2,把
 */
object words01 {
  def main(args: Array[String]): Unit = {

    val content = "I am studying scala. I like scala.";
//    val content = scala.io.Source.fromFile("test.txt").mkString;

    ////2. 把字符串拆分为单词
    val list = content.split(" "); // 使用 空格 去拆分字符串,结果是一个List
    //// list.foreach(ele => println(ele))

    ////3. 统计每个单词出现的次数
    //// 新建一个Map("I" -> 1, "am" -> 2)
    val map1 = scala.collection.mutable.Map("I" -> 0)
    //// 对于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


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

三,写拆分单词统计个数

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

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

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

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

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

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

////3. 统计每个单词出现的次数
//// 新建一个Map("I" -> 1, "am" -> 2)
val map1 = scala.collection.mutable.Map[String,Int]()
//// 对于list中的每个单词,

5.png

四,对Map结果排序

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

6.png