Scala函数式编程实例——单词计数

import java.io.{File, FileNotFoundException, IOException}
import scala.io.Source
import collection.mutable.Map

object WordCount {
  def main(args: Array[String]): Unit = {
    val directory = "H:\\testfiles"
    //建一个File对象
    val dirfile = new File(directory)

    try {
      //调用File对象的listFiles方法,得到其下所有文件对象构成的数组,files的类型为Array[java.io.File]
      val files = dirfile.listFiles
      //建立一个可变的空映射,(key,value)key是单词,value是次数
      val results = Map.empty[String, Int]
        //通过for循环对文件对象进行循环,分别处理各个文件对象进行循环,分别处理各个文件
      for (file <- files) {
        try {
          //从File对象建立Source对象,实现文件的读取
          val data = Source.fromFile(file)
          //用getLines方法获取包含一个所有行的迭代器,每次返回一行文本
          //flatMap函数flatMap 通常用于处理嵌套的集合结构,将嵌套的集合展开成一个平铺的集合。
          //flatMap 函数接受一个函数作为参数,这个函数用于对集合的每个元素进行操作,并返回一个新的集合。然后,flatMap 将所有新的集合合并成一个单一的集合。
          //replaceAll函数用来进行字符的替换,这里表示将所有非字母字符替换成空格,[^a-zA-Z ]表示所有非字母的的正则表达式
          //"\\s+"表示匹配一个或多个连续的空白字符,包括空格、制表符(tab)、换行符、回车符等正则表达式
          //split 是字符串的一个方法,用于根据指定的正则表达式模式将字符串拆分成子字符串数组。
          // split 方法的作用是根据模式匹配来分割字符串,并返回一个数组,其中包含了被拆分后的子字符串。
          val strs = data.getLines.flatMap(s => s.replaceAll("[^a-zA-Z ]", " ").split("\\s+"))
          //对上述迭代器进行遍历,更新results映射,实现单词计数,单词为key,相应单词数为value
          strs.foreach {
            word =>
              if (results.contains(word)) {
                results(word) = results(word) + 1
              } else {
                results(word) = 1
              }
          }
          data.close()
        } catch {
          case e: FileNotFoundException =>
            println(s"File not found: ${file.getName}")
          case e: IOException =>
            println(s"Error reading file: ${file.getName}")
        }
      }

      results.foreach{case (k,v)=>println(s"$k:$v")}
    } catch {
      case e: NullPointerException =>
        println("Directory not found or empty")
    }
  }

}

运行结果:

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值