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

 

 

第1章,“可伸展的语言”,给出了Scala的设计,和它后面的理由,历史的概要。 第2章,“Scala的第一步”,展示给你如何使用Scala完成若干种基本编程任务,而不牵涉过多关于如何工作的细节。本章的目的是让你的手指开始敲击并执行Scala代码。 第3章,“Scala的下一步”,演示更多的基本编程任务来帮助你更快速地上手Scala。本章之后,你将能够开始在简单的脚本任务中使用Scala。 第4章,“类和对象”,通过描述面向对象语言的基本建设模块和如何编译及运行Scala程序的教程开始有深度地覆盖Scala语言。 第5章,“基本类型和操作”,覆盖了Scala的基本类型,它们的文本,你可以执行的操作,优先级和关联性是如何工作的,还有什么是富包装器。 第6章,“函数式对象”,进入了Scala面向对象特征的更深层次,使用函数式(即,不可变)分数作为例子。 第7章,“内建控制结构”,显示了如何使用Scala的内建控制结构,如,if,while,for,try和match。 第8章,“函数和闭包”,深度讨论了函数式语言的基础建设模块,函数。 ...... 第31章,“组合子解析”,显示了如何使用Scala的解析器组合子库来创建解析器。 第32章,“GUI编程”,展示了使用Scala库简化基于Swing的GUI编程的快速旅程。 第33章,“SCell电子表”,通过展示一个完整的电子表的实现,集中演示了Scala的一切。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值