一、任务分析
-
- 把文字内容从.txt文件中读到内存中。
-
- 写程序分析数据。
-
- 把结果写入.txt文件。
二、从文件中读出内容
在scala中,涉及到文件读写的方法有很多,可以使用java.io下的工具包,也可以使用scala.io下的功能。
下面介绍source.fromFile这个方法。
格式:scala.io.Source.formFile(文件名)
作用:读入一个文件
三、代码(一 & 二):
1.读入test.txt的内容
Source.forFile().mkString
2.对字符串进行拆分 把句子变成一个一个单词
split
object word01 {
def main(args: Array[String]): Unit = {
// 1.读入test.txt的内容 大大的长长的字符串
// Source.forFile().mkString
// 2.对字符串进行拆分 把句子变成一个一个单词
// split
// 1.读入test.txt的内容 大大的长长的字符串
val content = scala.io.Source.fromFile("./test.txt").mkString
println(content)
// 2.对字符串进行拆分
// map把每个单词都变为小写
val rst = content.split("\\W+").map(ele => ele.toLowerCase)
//["We", "are", "all", "in", "the", "gutter", "but", "some", "ot", "us", "are", "iooking", "at", "the","stars"]
rst.foreach(println)
// \W+ 正则表示式, W表示一个非字符(空格,符号 ,。 ? ! : ;)
}
}
注意:需要创一个文件,这个文件要和 src 为同级关系
运行结果:
四、写拆分单词统计个数
-
1. 分隔出一个一个的单词。
-
2. 建立一个Map,key是单词,value是次数。
-
3. 遍历所有的单词,对每个单词来说:
判断单词是否存在,如果存在把对应的key+1;
否则就设置对应的key,且value为1
// 3.空的容器保存键值对数据: 键:单词、值:次数
val map = scala.collection.mutable.Map[String, Int]()
rst.foreach(word => {
// 如果word在map中存在,就把值+1
if(map.contains(word)) {
map(word) += 1
}
// 如果word在map中不存在,就把值设为1
else {
// map += word -> 1
map (word) = 1
}
// println(word, map.contains(word))
})
// 4.打印统计结果
map.foreach(println)
运行结果:
五、Map结果排序
Map本身是键值对,它是无序的。可以先转成List或者Seq,然后再排序。
// 5.排序
// 按照单词出现的频率,从高到低排序
// map是无序的,不能做排序
// list是可以排序的
map.toList.sortBy(_._2).reverse.foreach(ele => {
println(ele._1, ele._2)
})
运行结果:
六、把结果写入到文件中
// 6、把结果写入到文件中
val writer = new FileWriter("result.txt")
wordLists.foreach(ele => {
writer.write(s"${ele._1}:${ele._2}\n")
})
writer.close()
运行结果:
完整代码:
object word01 {
def main(args: Array[String]): Unit = {
// 1.读入test.txt的内容 大大的长长的字符串
// Source.forFile().mkString
// 2.对字符串进行拆分 把句子变成一个一个单词
// split
// 1.读入test.txt的内容 大大的长长的字符串
val content = scala.io.Source.fromFile("./test.txt").mkString
println(content)
// 2.对字符串进行拆分
// map把每个单词都变为小写
val rst = content.split("\W+").map(ele => ele.toLowerCase)
// ["We", "are", "all", "in", "the", "gutter", "but", "some", "ot", "us", "are", "iooking", "at", "the","stars"]
rst.foreach(println)
// \W+ 正则表示式, W表示一个非字符(空格,符号 ,。 ? ! : ;)
// 3.空的容器保存键值对数据: 键:单词、值:次数
val map = scala.collection.mutable.Map[String, Int]()
rst.foreach(word => {
// 如果word在map中存在,就把值+1
if(map.contains(word)) {
map(word) += 1
}
// 如果word在map中不存在,就把值设为1
else {
// map += word -> 1
map (word) = 1
}
// println(word, map.contains(word))
})
// 4. 打印统计结果
// map.foreach(println)
// 5.排序
// 按照单词出现的频率,从高到低排序
// map是无序的,不能做排序
// list是可以排序的
val wordLists = map.toList.sortBy(_._2).reverse
// 6、把结果写入到文件中
val writer = new FileWriter("result.txt")
wordLists.foreach(ele => {
writer.write(s"${ele._1}:${ele._2}\n")
})
writer.close()
}
}