在日常的文本处理场景中,统计单词出现的频率是一个非常经典的需求。Scala 作为一门融合了面向对象和函数式编程的语言,凭借其简洁的语法和强大的集合操作能力,能让我们高效地完成这个任务。
一、需求分析
我们的核心需求是:
- 读取指定文本文件(
text)中的内容; - 将文本拆分为单词,并统一转换为小写(避免大小写导致的统计误差);
- 统计每个单词出现的次数;
- 按照出现次数从高到低排序;
- 将统计结果写入
result文件中。
二、完整代码实现
首先,我们先看完整的实现代码
package words
import java.io.FileWriter
object words{
def main(args: Array[String]): Unit = {
val content = scala.io.Source.fromFile("text").mkString;
// 1. 将字符串拆分为单词
val list = content.split("\W+").map(word=>word.toLowerCase) // 使用空格 去拆分字符串,结果是一个List
// list.foreach(ele => println(ele))
// 3. 统计每个单词出现的次数
// 键 -> 单词,值 -> 次数
val map1 = scala.collection.mutable.Map[String, Int]()
list.foreach(word => {
// 检查它在map1中是否存在
if (map1.contains(word)) {
map1(word) += 1 // 存在,把它的值+1
} else {
map1(word) = 1 // 不存在,把它的值设为1
}
})
//4.对结果排序
val wordslist = map1.toList.sortBy(_._2).reverse
//5.把结果输出到一个新的文件中
val fileWriter = new FileWriter("result")
wordslist.foreach(el => {
fileWriter.write(s"${el._1} - ${el._2} \n")
})
fileWriter.close()
}
}