wordcount的详细分析
def
main
(
args: Array
[
String
])
: Unit =
{
//
文本拆分成多行,把多行转换成一个集合
val
list:
List
[
String
]
= Source.
fromFile
(
"input/word.txt"
)
.getLines
()
.toList
println
(
list
)
//flatmap
是先
map
再
flatten
//
此时文本中的每一行就是一个元素,下面的下划线就是一行
//
得到的结果是一个一个的单词
val
wordList:
List
[
String
]
= list.flatMap
(
_.split
(
" "
))
//
对每个单词进行转换操作(单词,
1
)
val
word2OneList:
List
[(
String
, Int
)]
= wordList.map
((
_,
1
))
//
上面得到的结果是一个集合,集合中的内容是:(
hello,1
)
(word,1)(word,1)(hello,1)...
//
根据每个元素的
key
进行分组
//
表示的是按照对偶元素中的第一个元素
(
单词
)
分组。第一个下划线是每个元组,第二个
_1,
表示的是元组中的第一个元素
val
word2ListMap:
Map
[
String
,
List
[(
String
, Int
)]]
= word2OneList.groupBy
(
_._1
)
println
(
word2ListMap
)
//
上面是一个
map
集合,注意一下
map
的类型,表示的是相同的元组是放到了同一个
list
集合
//
上面的
Map
中的每个元素的格式是(单词名
->List((
单词名,
1)
(单词名,
1
)(单词名,
1
)
)
)
//Map中
元素的本质是元组,元组的第一个元素代表单词,第二个元素是一个
list
集合。最终操作的是每个元组
//map
当中
->
其实就是逗号的意思
val
word2CountMap:
Map
[
String
, Int
]
= word2ListMap.map
(
//map
后的小括号需要我们传递一个逻辑,使用匿名函数:()
=>{}
kv =>
{
//kv
表示的就是拿到的每个元素,元素的格式是: (单词名
->List((
单词名,
1)
(单词名,
1
)(单词名,
1
)
)
)
//
最后统计的格式是 (
hello,4
)
(word,3)
这种形式
(
kv._1, kv._2.size
)
//
格式就是(单词,对应的单词所在的集合的长度)
}
)
println
(
word2CountMa