您的位置:首页 > 其它

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

2017-06-28 12:26 549 查看
使用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表示的是元组中的第二个值,即单词出现的次数。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐