Scala中使用两种方式对单词进行次数统计(wordCount)

来源:互联网 发布:淘宝渠道管理在哪里 编辑:程序博客网 时间:2024/05/22 02:17

使用Scala对单词数量进行统计:
假设有单词数组:
val arr = Array(“hello tom”,”hello jerry”,”hello hello”)
需要对Array中的每个单词进行统计计数。
可以使用如下方式:
方式一:

scala> arr.flatMap(_.split(" ")).map((_,1)).groupBy(_._1).map(t=>(t._1,t._2.size))res1: scala.collection.immutable.Map[String,Int] = Map(tom -> 1, jerry -> 1, hello -> 4)

解释说明:
1、 arr.flatMap(_.split(” “)) //相当于是将Array中的数组进行压缩,下划线代表的是Arrary中的每个元素,并且按照” “进行切分,运行后的结果如下:

scala> arr.flatMap(_.split(" "))res0: Array[String] = Array(hello, tom, hello, jerry, hello, hello)

2、 接着对map中的每个元素进行汇总计算

scala> arr.flatMap(_.split(" ")).map((_,1))res2: Array[(String, Int)] = Array((hello,1), (tom,1), (hello,1), (jerry,1), (hello,1), (hello,1))

解释说明:
这里的map((_,1))相当于是将前面的Array变成元组的形式

3、接着把array进行分组:
scala> arr.flatMap(.split(” “)).map((,1)).groupBy(_._1)
res3: scala.collection.immutable.Map[String,Array[(String, Int)]] = Map(tom -> Array((tom,1)), jerry -> Array((jerry,1)), hello -> Array((hello,1), (hello,1), (hello,1), (hello,1)))

解释说明:
这里的意思是将上面的array按照key的方式进行分组

4、最后将结果进行求和

arr.flatMap(_.split(" ")).map((_,1)).groupBy(_._1).map(t=>(t._1,t._2.size))

其中t._1就是上面的单词作为key,value是t._2.size,即Array的大小

方式二:

arr.flatMap(_.split(" ")).map((_,1)).groupBy(_._1).mapValues(_.foldLeft(0)(_+_._2))

其中:
arr.flatMap(.split(” “)).map((,1)).groupBy(_._1),这里和上面的一样,不用赘述

scala> arr.flatMap(_.split(" ")).map((_,1)).groupBy(_._1)res4: scala.collection.immutable.Map[String,Array[(String, Int)]] = Map(tom -> Array((tom,1)), jerry -> Array((jerry,1)), hello -> Array((hello,1), (hello,1), (hello,1), (hello,1)))

mapValues的用途是直接将Array的内容进行按照key相同的进行统计计算。
.foldLeft(0)(+._2) 第一个下划线表示的是的是数组中的key,意思是分别取出其中的Array集合,.foldLeft(0)(+_.2)表示将Array进行求和,后边括号中的第一个下划线表示的是处事值0,第二个下划线是表示的是元组,.2表示的是元组中的第二个值,即单词出现的次数。

阅读全文
1 0