版权声明:本文为博主原创文章,未经博主允许不得转载!!
欢迎访问:https://blog.csdn.net/qq_21439395/article/details/81022890 
<https://blog.csdn.net/qq_21439395/article/details/81022890>
交流QQ: 824203453
 
实现方案一:  map + flatten + groupBy
实现方式二:flatMap + groupBy
object ScalaWordCount { def main(args: Array[String]): Unit = { // 原始数据 val 
arr = Array[String]("hello tom hello jim", "hello spark hello jim tom") // 
一行完全可以实现,但是不推荐 // arr.map(x=>x.split(" 
")).flatten.map(x=>(x,1)).groupBy(x=>x._1).map(x=>(x._1,x._2.length)).toList.sortBy(x=> 
-x._2) // .foreach(x=>println(x)) // 数据切分 // val lines: Array[Array[String]] = 
arr.map(x=>x.split(" ")) // 数据压平 // val flatLines: Array[String] = 
lines.flatten // 有一个替代的方法,flatMap 先map 再flatten val flatLines = arr.flatMap(x 
=> x.split(" ")) // 和1 组装起来 val wordsWithOne: Array[(String, Int)] = 
flatLines.map(w => (w, 1)) // 按照单词分组 就是元组的第一个元素 val grouped: Map[String, 
Array[(String, Int)]] = wordsWithOne.groupBy(t => t._1) // 统计单词出现的次数 
正常情况下是求和,但是这里是一个特例,所以可以使用长度来判断次数 val result: Map[String, Int] = grouped.map(t 
=> (t._1, t._2.length)) // 排序 // map不能直接排序,那么就转变成list,然后调用List集合上的sortBy方法 val 
sortedResult: List[(String, Int)] = result.toList.sortBy(t => -t._2) // 
sortedResult.foreach(x=>println(x)) sortedResult.foreach(println) } } 
 
实现方式三:flatMap + mapValues  直接统计数组的长度了
 // 原始数据 val arr = Array[String]("hello tom hello jim","hello spark hello jim 
tom") // 有一个替代的方法,flatMap 先map 再flatten val flatLines = arr.flatMap(_.split(" 
")) // 和1 组装起来 val wordsWithOne: Array[(String, Int)] = flatLines.map(w=>(w,1)) 
// 按照单词分组 就是元组的第一个元素 val grouped: Map[String, Array[(String, Int)]] = 
wordsWithOne.groupBy(t=>t._1) // 统计单词出现的次数 正常情况下是求和,但是这里是一个特例,所以可以使用长度来判断次数 val 
result: Map[String, Int] = grouped.mapValues(_.length) val sortedResult: 
List[(String, Int)] = result.toList.sortBy(t=> -t._2) 
sortedResult.foreach(println) 
 
实现方式四:  在mapValues中,直接统计 次数的总和 
 val arr = Array[String]("hello tom hello jim", "hello spark hello jim tom") 
val flatLines = arr.flatMap(_.split(" ")) val wordsWithOne: Array[(String, 
Int)] = flatLines.map((_, 1)) val grouped: Map[String, Array[(String, Int)]] = 
wordsWithOne.groupBy(_._1) val result: Map[String, Int] = grouped.mapValues({ 
// 输入参数 Array[(String, Int)] t => // 取出数组中的每一个元素的第二个值,也就是单词的次数 再调用sum方法求总和 
t.map(_._2).sum }) 
 
实现方式五: 在mapValues中,调用foldLeft方法,统计单词出现的总的次数
 
 val arr = Array[String]("hello tom hello jim", "hello spark hello jim tom") 
val flatLines = arr.flatMap(_.split(" ")) val wordsWithOne: Array[(String, 
Int)] = flatLines.map((_, 1)) val grouped: Map[String, Array[(String, Int)]] = 
wordsWithOne.groupBy(_._1) val result: Map[String, Int] = grouped.mapValues({ 
// 输入参数 Array[(String, Int)] t => // 取出数组中的每一个元素的第二个值,也就是单词的次数 再调用sum方法求总和 
t.map(_._2).sum // 这里只能用foldLeft,因为类型不一致 x:Int y:(String,Int) t.foldLeft(0)((x, 
y) => x + y._2) }) 
 
版权声明:本文为博主原创文章,未经博主允许不得转载!!
欢迎访问:https://blog.csdn.net/qq_21439395/article/details/81022890 
<https://blog.csdn.net/qq_21439395/article/details/81022890>
交流QQ: 824203453
 
 
热门工具 换一换