(一)任务分析
-
把文字内容从.txt文件中读到内存中。
-
写程序分析数据。
-
把结果写入.txt文件。
(二)从文件中读出内容
在scala中,涉及到文件读写的方法有很多,可以使用java.io下的工具包,也可以使用scala.io下的功能。
下面介绍source.fromFile这个方法。
格式:scala.io.Source.formFile(文件名)
作用:读入一个文件
提问:如果想要直接得到文本文件,怎么办呢?
使用mkString方法即可。
import scala.io.Source
val content = Source.fromFile("example.txt").mkString
println(content)
(三)写拆分单词统计个数
思路:
1. 分隔出一个一个的单词。
2. 建立一个Map,key是单词,value是次数。
3. 遍历所有的单词,对每个单词来说:
判断单词是否存在,如果存在把对应的key+1;
否则就设置对应的key,且value为1
(四)对Map结果排序
Map本身是键值对,它是无序的。可以先转成List或者Seq,然后再排序。
(五)结果写入
package words;
import java.io.FileWriter
/*
*1. 读入test.txt这个文件,得到一个长的字符串:"I am studying scala. I like scala."
*
*2. 把这个字符串拆分成为一个的单词:I, am, studying, scala .....
*
*3. 统计每个单词出现的次数
*
*4. 对结果排序(降序序列)
*
*5. 把结果输出到一个新的文件中
*/
object words01 {
def main(args: Array[String]) = {
val content = scala.io.Source.fromFile("test.txt").mkString;
// 2.把字符串拆分单词
val list = content.split("\W+").map(word=>word.toLowerCase) // 使用 正则表达式 W+ 去拆分字符串,结果是一个list
// W+ 表示一个或者多个 (1,?,! 空格)
// 一个或者多个
// 3. 统计每个单词出现的次数
// 新建一个map("I" -> 1, "am" -> 2)
val map1 = scala.collection.mutable.Map[String, Int]()
// 对于list中的每个元素
list.foreach(word =>{
// 检查它在Map中是否存在?
// println(word, map1.contains(word))
if(map1.contains(word)) {
map1(word) += 1 // 存在:把它的值+1
} else {
map1(word) = 1 // 不存在:把它的值设为1
}
})
// 4.对结果排序(降序排列)
// Map本身是无序的,它没有排序的功能
// 如果要对它的内容进行排序,那么,我们要把它转换成可以排序的集合:List
// sortBy排序:根据元组的第二个值
// reverse:翻转
val wordList = map1.toList.sortBy(_._2).reverse
// 5.把结果输出到一个新文件中
val fileWriter = new FileWriter("result.txt")
wordList.foreach(el => {
fileWriter.write(s"${el._1} -> ${el._2} \n")
})
fileWriter.close()
}
}