版权声明:本文为博主原创文章,未经博主允许不得转载!!
欢迎访问: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
交流QQ: 824203453