题目
现有文档1–文档6共6份文档,每份文档中包含若干内容,要求如下:
1、从所有文档中提取出包含关键字的所有行,要统计的关键字为:
网络暴力
广告
日本央行
土耳其
加息
美国
比特币
新冠
2、统计每个关键字出现的总次数
3、以如下形式输出:
关键字 (行1/行2/行3/…) 关键字总计出现次数
代码
import java.io.File
import scala.collection.mutable.ArrayBuffer
import scala.io.Source
import scala.util.matching.Regex
object WordCount {
val keyList: List[String] = List("网络暴力", "广告", "日本央行", "土耳其", "加息", "美国", "比特币", "新冠")
val printReturn: ArrayBuffer[(String, String, Int)] = new ArrayBuffer[(String, String, Int)]()
def main(args: Array[String]): Unit = {
val dirfile = new File("....")
// 获取目录文件
val files = dirfile.listFiles()
// 遍历关键词
for (k <- keyList) {
var num: Int = 0
var rowStr: String = ""
// 遍历文件
for (file <- files) {
var row: Int = 0
val fileName: String = file.getName
// 为了防止没有关键词的文章名也显示在结果中,创建一个新的字符串,最后判断检索到的关键词个数变化才添加进结果
var value: String = ""
// 声明变量记住现在的关键词个数
val keyNum: Int = num
val data = Source.fromFile(file)
val strdata = data.getLines()
// 读出文件行
for (v <- strdata) {
row += 1
//进行正则匹配,关键词在一行匹配的次数
val key: Regex = k.r
val length = (key findAllIn v).length
if (length != 0) {
value += "行" + row + "/"
num += length
}
}
// 判断文章中有没有关键词,如果没有,就不将文章名添加进结果,有才添加
if (num != keyNum) {
rowStr += fileName + ":" + value
}
}
printReturn.addOne((k, rowStr, num))
}
printReturn.foreach(i => println(i))
}
}
结果
(网络暴力,文档1.txt:行1/,1)
(广告,文档1.txt:行3/,2)
(日本央行,文档2.txt:行1/行3/行5/行7/行9/行14/行16/行18/行20/行30/行32/行34/文档3.txt:行35/,19)
(土耳其,文档3.txt:行3/行5/行7/行11/行13/行15/行17/行23/,16)
(加息,文档3.txt:行1/行9/行13/行15/行17/行19/行21/行23/行27/行29/行31/,16)
(美国,文档2.txt:行30/文档3.txt:行19/文档4.txt:行7/行9/行15/行17/行23/行25/行37/行41/行47/行49/文档6.txt:行7/,17)
(比特币,文档5.txt:行1/行3/行7/行9/行11/行13/行15/行19/行21/行25/行27/行29/行31/行33/,37)
(新冠,文档6.txt:行7/,1)