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")
}
}
}
运行结果: