Scala 词频统计:使用 Source 类读取文件并计算单词出现次数
import scala.io.Source // 导入 Scala 标准库中的 Source 类
object shiyan2_3 { // 定义一个名为 shiyan2_3 的对象
def main(args: Array[String]): Unit = { // 定义一个名为 main 的方法,接收一个字符串数组类型的参数 args,并返回一个 Unit 类型的值
val filename = 'file.txt' // 定义一个名为 filename 的常量,赋值为字符串 'file.txt'
val source = Source.fromFile('D:\test.txt') // 从文件中读取数据,返回一个 Source 类型的对象
val list = source.getLines().toList // 获取 source 对象中的所有行,并将其转换为 List 类型
source.close() // 关闭 source 对象
var wordList: List[String] = list.flatMap(_.split(' ')) // 将 list 中的每一行按空格分割成单词,并将所有单词合并到一个 List 中
var wordtuples:List[(String,Int)] = wordList.map((_,1)) // 将 wordList 中的每个单词转换为一个元组,第一个元素为单词本身,第二个元素为 1
val wordgroup:Map[String,List[(String,Int)]] = wordtuples.groupBy(kv=>kv._1) // 将 wordtuples 按照第一个元素(即单词本身)进行分组,
// 返回一个 Map 类型的对象,其中键为单词本身,值为包含该单词所有元组的 List
var wordcount:Map[String,Int] = wordgroup.mapValues(list=>list.size) // 将 wordgroup 中的每个键值对(即每个单词及其对应的元组 List)
// 转换为一个新的键值对,其中键为单词本身,值为该单词在元组 List 中出现的次数
println(wordcount) // 输出 wordcount
}
}
代码解析:
- 导入 Source 类:
import scala.io.Source
- 导入 Scala 标准库中的 Source 类,用于读取文件数据。
- 定义对象:
object shiyan2_3 {
// ...
}
- 定义一个名为 shiyan2_3 的对象,用于存放代码的逻辑。
- 定义 main 方法:
def main(args: Array[String]): Unit = {
// ...
}
- 定义一个名为 main 的方法,这是程序的入口点。它接收一个字符串数组类型的参数 args,并返回一个 Unit 类型的值(表示没有返回值)。
- 定义文件名:
val filename = 'file.txt'
- 定义一个名为 filename 的常量,赋值为字符串 'file.txt',用于存储要读取的文件名。
- 读取文件数据:
val source = Source.fromFile('D:\test.txt')
- 使用 Source.fromFile 方法从指定的路径 'D:\test.txt' 读取文件数据,并返回一个 Source 类型的对象。
- 获取所有行:
val list = source.getLines().toList
- 使用 source.getLines() 方法获取文件中的所有行,并使用 toList 方法将其转换为 List 类型。
- 关闭文件:
source.close()
- 使用 source.close() 方法关闭文件,释放资源。
- 将文本分割成单词:
var wordList: List[String] = list.flatMap(_.split(' '))
- 使用 flatMap 方法遍历 list 中的每一行,并使用 split(' ') 方法按空格将每一行分割成单词,最终将所有单词合并到一个新的 List 中。
- 创建单词元组:
var wordtuples:List[(String,Int)] = wordList.map((_,1))
- 使用 map 方法遍历 wordList 中的每个单词,并将其转换为一个元组,第一个元素为单词本身,第二个元素为 1(表示该单词出现 1 次)。
- 分组单词:
val wordgroup:Map[String,List[(String,Int)]] = wordtuples.groupBy(kv=>kv._1)
- 使用 groupBy 方法将 wordtuples 按照第一个元素(即单词本身)进行分组,并返回一个 Map 类型的对象。Map 的键为单词本身,值为包含该单词所有元组的 List。
- 统计单词出现次数:
var wordcount:Map[String,Int] = wordgroup.mapValues(list=>list.size)
- 使用 mapValues 方法遍历 wordgroup 中的每个键值对,并将其转换为一个新的键值对。新的键值对的键为单词本身,值为该单词在元组 List 中出现的次数(即该单词出现的总次数)。
- 输出结果:
println(wordcount)
- 使用 println 方法输出 wordcount,即每个单词及其出现次数的统计结果。
示例:
假设 'D:\test.txt' 文件内容为:
This is a test file.
This is a test file.
则程序输出的结果为:
Map(This -> 2, is -> 2, a -> 2, test -> 2, file -> 2)
总结:
本示例使用 Scala 语言的 Source 类读取文本文件,并计算文件中每个单词出现的次数。代码包含详细的注释,解释了每个步骤的实现逻辑。
原文地址: https://www.cveoy.top/t/topic/kx1e 著作权归作者所有。请勿转载和采集!