1. 程式人生 > 其它 >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)