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