Scala集合的應用舉例:統計單詞的數量、計算每一個班級學生的平均年齡
阿新 • • 發佈:2022-03-06
集合的應用舉例:統計單詞的數量、計算每一個班級學生的平均年齡
目錄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)