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

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

作者:互联网

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

目录

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