scala算子综合案例(一)----- wordcount的多种实现

版权声明:本文为博主原创文章,未经博主允许不得转载!!

欢迎访问: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

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值