版权声明:本文为博主原创文章,未经博主允许不得转载!!
欢迎访问: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
热门工具 换一换