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

38 阅读2分钟

(四)对Map结果排序

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

package words

object words01 {
  def main(args: Array[String]): Unit = {
    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(空格分隔字符串)

image.png

解决

image.png

小问题2(大小写)

image.png

解决

image.png

小问题3(去掉"I" -> 0)

image.png

解决

image.png

(五)输出到新文件中

package words

import java.io.FileWriter

object words01 {
  def main(args: Array[String]): Unit = {
    val content = scala.io.Source.fromFile("test.txt").mkString;

    // 2. 把字符串拆分为单词
    val list = content.split("\W+").map(word =>word.toLowerCase)
    // 使用正则表达式W+ 去拆分字符串,结果是一个List
    //\W 表示一个非字符(!,.,?,空格)
    // + 表示一个或多个
    // 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排序:根据元组的第二个值
    // reverse:翻转
    val wordList = map1.toList.sortBy(_._2).reverse

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

image.png

image.png