ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Scala集合的应用举例:统计单词的数量、计算每一个班级学生的平均年龄

2022-03-06 19:32:22  阅读:203  来源: 互联网

标签:班级 java String val Scala 平均年龄 List kv spark


集合的应用举例:统计单词的数量、计算每一个班级学生的平均年龄

目录

1、统计单词的数量

使用Java的方式

object Demo23WordCount {
  def main(args: Array[String]): Unit = {
	
    val hashMap = new util.HashMap[String, Integer]()

    val bufferedReader = new BufferedReader(new FileReader("data/words.txt"))

    var line: String = bufferedReader.readLine()
    while (line != null) {
      val split: Array[String] = line.split(",")
      for (word <- split) {
        //判断map集合中是否存在这个单词
        if (hashMap.containsKey(word)) {
          //取出之前的统计结果
          val count: Integer = hashMap.get(word)
          //在之前的基础上加一
          hashMap.put(word, count + 1)
        } else {
          //如果单词在hashMap中不存在存一个一进去
          hashMap.put(word, 1)
        }
      }
      line = bufferedReader.readLine()
    }

    println(hashMap)//{hive=6, java=12, spark=12, hadoop=6}
  }
}

使用Scala的普通方式

object Demo23WordCount {
  def main(args: Array[String]): Unit = {
	//1、读取文件
    val lines: List[String] = Source.fromFile("data/words.txt").getLines().toList

    //2、将每一行中的多个单词拆分出来,每隔单词一行
    val words: List[String] = lines.flatMap(line => line.split(","))

    //3、按照单词分组,将同一个单词分到同一个组内,返回一个Map集合(k,v)格式
    val groupBy: Map[String, List[String]] = words.groupBy((word: String) => word)
    groupBy.foreach(println)
    /*
      (hadoop,List(hadoop, hadoop, hadoop, hadoop, hadoop, hadoop))
      (spark,List(spark, spark, spark, spark, spark, spark, spark, spark, spark, spark, spark, spark))
      (java,List(java, java, java, java, java, java, java, java, java, java, java, java))
      (hive,List(hive, hive, hive, hive, hive, hive))
     */

    //4、统计单词的数量,使用map函数,返回一个Map集合
    val wordCount: Map[String, Int] = groupBy.map(kv => {
      //第一个元素,作为新Map集合的key
      val word: String = kv._1

      //组内所有的单词,作为新Map集合的value
      val values: List[String] = kv._2

      //计算单词的数量
      val count: Int = values.length

      //返回结果
      (word, count)
    })

    wordCount.foreach(println)
      /*
        (hadoop,6)
        (spark,12)
        (java,12)
        (hive,6)
       */
  }
}

Scala方式的链式调用(这种方式就是spark代码)

object Demo23WordCount {
  def main(args: Array[String]): Unit = {
  
  Source.fromFile("data/words.txt")
      .getLines()
      .toList
      .flatMap(_.split(",")) //将一行转换成多行
      .groupBy(w => w) //按照单词分组
      .map(kv => (kv._1, kv._2.length)) //统计单词的数量
      .foreach(println)
      }
   }

2、计算每一个班级学生的平均年龄

package com.shujia.scala

import scala.io.Source

object Demo24Student {
  def main(args: Array[String]): Unit = {

    //1、读取文件
    val students: List[String] = Source.fromFile("data/students.txt").getLines().toList


    //2、取出班级和年龄
    val clazzAndAge: List[(String, Double)] = students.map(student => {
      //取出班级和年龄
      val split: Array[String] = student.split(",")
      val age: Double = split(2).toDouble
      val clazz: String = split(4)

      (clazz, age)
    })

    //3、按照班级分组
    val groupBy: Map[String, List[(String, Double)]] = clazzAndAge.groupBy(kv => kv._1)


    //4、统计平均年龄
    val clazzAvgAge: Map[String, Double] = groupBy.map(kv => {
      //班级
      val clazz: String = kv._1

      //一个班级所有的数据
      val values: List[(String, Double)] = kv._2

      //取出年龄
      val ages: List[Double] = values.map(ca => ca._2)

      //九三平均值
      val avgAge: Double = ages.sum / ages.length

      (clazz, avgAge)
    })

    clazzAvgAge.foreach(println)
  }
}

    执行结果:
            (理科六班,22.48913043478261)
            (理科一班,22.333333333333332)
            (理科二班,22.556962025316455)
            (理科五班,22.642857142857142)
            (文科一班,22.416666666666668)
            (文科六班,22.60576923076923)
            (理科三班,22.676470588235293)
            (文科四班,22.506172839506174)
            (理科四班,22.63736263736264)
            (文科二班,22.379310344827587)
            (文科五班,22.30952380952381)
            (文科三班,22.680851063829788)

标签:班级,java,String,val,Scala,平均年龄,List,kv,spark
来源: https://www.cnblogs.com/saowei/p/15973107.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有