1. 一、相关信息
    题目:
    1、统计班级人数
    2、统计学生的总分
    3、统计总分年级排名前十学生各科的分数
    4、统计总分大于年级平均分的学生
    5、统计每科都及格的学生
    6、统计偏科最严重的前100名学生
    数据样例(部分数据):
    1.学生信息数据:students.txt
  1. 1500100001,施笑槐,22,女,文科六班
  2. 1500100002,吕金鹏,24,男,文科七班
  3. 1500100003,单乐蕊,22,女,理科六班
  4. 1500100004,葛德曜,24,男,理科三班
  5. 1500100005,宣谷芹,22,女,理科五班
  6. 1500100006,边昂雄,21,男,理科二班
  7. 1500100007,尚孤风,23,女,文科六班
  8. 1500100008,符半双,22,女,理科六班
  9. 1500100009,沈德昌,21,男,理科一班
  10. 1500100010,羿彦昌,23,男,理科六班
  11. 1500100011,宰运华,21,男,理科三班
  12. 1500100012,梁易槐,21,女,理科一班
  13. 1500100013,逯君昊,24,男,文科二班
  14. 1500100014,羿旭炎,23,男,理科五班
  15. 1500100015,宦怀绿,21,女,理科一班
  16. 1500100016,潘访烟,23,女,文科一班
  1. 2.学生分数信息(部分):
  1. 500100001,1000001,98
  2. 1500100001,1000002,5
  3. 1500100001,1000003,0
  4. 1500100001,1000004,29
  5. 1500100001,1000005,85
  6. 1500100001,1000006,52
  7. 1500100002,1000001,139
  8. 1500100002,1000002,102
  9. 1500100002,1000003,44
  10. 1500100002,1000004,18
  11. 1500100002,1000005,46
  12. 1500100002,1000006,91
  13. 1500100003,1000001,48
  1. 3.学生科目信息(部分):
  1. 1000001,语文,150
  2. 1000002,数学,150
  3. 1000003,英语,150
  4. 1000004,政治,100
  5. 1000005,历史,100
  6. 1000006,物理,100
  7. 1000007,化学,100
  8. 1000008,地理,100
  9. 1000009,生物,100
 
  1. 二、题目代码编写

    1、统计班级人数
  1. package shujia
  2.  
  3. import scala.io.Source
  4. //1、统计班级人数
  5. /**
  6. * 以下所有的方法都是返回新的集合,不会修改原始的集合
  7. * 同时以下这些方法在set集合中也有,除了sort
  8. * foreach:遍历数据
  9. * map:一条一条处理数据
  10. * filter:过滤数据
  11. * flatMap:将一行转换成多行
  12. * sortBy:排序
  13. * groupBy:分组
  14. */
  15. object Test2 {
  16. def main(args: Array[String]): Unit = {
  17. //读取文件
  18. val students: List[String] = Source.fromFile("data/score.txt").getLines().toList
  19. //按照逗号分割
  20.  
  21. val stringses: List[Array[String]] = students.map(line => line.split(","))
  22.  
  23. //3.过滤脏数据
  24. val listFilter: List[Array[String]] = stringses.filter(line => line.length == 3)
  25.  
  26. //4.取数据
  27. val scores: List[(String, Int)] = listFilter.map {
  28. case Array(id: String, _: String, sco: String) =>
  29. (id, sco.toInt)
  30. }
  31. //分组group
  32. val group: Map[String, List[(String, Int)]] = scores.groupBy(word => word._1)
  33. //统计数量
  34.  
  35. val sumScoList: Map[String, Int] = group.map {
  36. case (id: String, list: List[(String, Int)]) =>
  37. val sco: List[Int] = list.map { case (_, sco: Int) => sco }
  38. val sumSco: Int = sco.sum
  39. (id, sumSco)
  40. }
  41. sumScoList.foreach(println)
  42. }
  43. }
  1. 2、统计学生的总分
  1. package com.shujia.scala
  2.  
  3. import scala.io.Source
  4.  
  5. object Demo22SumScore {
  6. def main(args: Array[String]): Unit = {
  7. /**
  8. * 2、统计学生的总分
  9. */
  10.  
  11. //1、读取分数表
  12. val scoresList: List[String] = Source.fromFile("data/score.txt").getLines().toList
  13.  
  14. //2、过滤脏数据
  15. val filterList: List[String] = scoresList.filter((line: String) => {
  16. val length: Int = line.split(",").length
  17. length == 3
  18. })
  19.  
  20. //3、取出学号和分数
  21. val idAndScore: List[(String, Int)] = filterList.map((line => {
  22. val split: Array[String] = line.split(",")
  23. //学号
  24. val id: String = split.head
  25. //分数
  26. val score: Int = split.last.toInt
  27. (id, score)
  28. }))
  29.  
  30. //4、按照学号分组
  31. val groupByList: Map[String, List[(String, Int)]] = idAndScore.groupBy(kv => kv._1)
  32.  
  33. //5、统计学生的总分
  34. val sumScoMap: Map[String, Int] = groupByList.map((kv: (String, List[(String, Int)])) => {
  35. val id: String = kv._1
  36. val scores: List[(String, Int)] = kv._2
  37. //取出每个学生所有的分数
  38. val scos: List[Int] = scores.map(sco => sco._2)
  39. //计算总分
  40. val sumSco: Int = scos.sum
  41.  
  42. (id, sumSco)
  43. })
  44.  
  45. sumScoMap.foreach(println)
  46. }
  47.  
  48. }
    /*
    * 第二种方法,case
    */
  1. object Demo22SumScore {
    def main(args: Array[String]): Unit = {
    /**
    * 2、统计学生的总分
    */

    //1、读取分数表
    val scoresList: List[String] = Source.fromFile("data/score.txt").getLines().toList

    //2、过滤脏数据
    val filterList: List[String] = scoresList.filter((line: String) => {
    val length: Int = line.split(",").length
    length == 3
    })

    //3、取出学号和分数
    val idAndScore: List[(String, Int)] = filterList.map((line => {
    val split: Array[String] = line.split(",")
    //学号
    val id: String = split.head
    //分数
    val score: Int = split.last.toInt
    (id, score)
    }))

    //4、按照学号分组
    val groupByList: Map[String, List[(String, Int)]] = idAndScore.groupBy(kv => kv._1)

    //5、统计学生的总分
    val sumScoMap: Map[String, Int] = groupByList.map((kv: (String, List[(String, Int)])) => {
    val id: String = kv._1
    val scores: List[(String, Int)] = kv._2
    //取出每个学生所有的分数
    val scos: List[Int] = scores.map(sco => sco._2)
    //计算总分
    val sumSco: Int = scos.sum

    (id, sumSco)
    })

    sumScoMap.foreach(println)
    }

    }
  1.  
  1. 3、统计总分年级排名前十学生各科的分数
  1. package shujia
  2.  
  3. import scala.io.Source
  4.  
  5. //1、统计总分年级排名前十学生各科的分数
  6. object Test3Top10 {
  7. def main(args: Array[String]): Unit = {
  8.  
  9. //1、读取分数
  10. val lines: List[String] = Source.fromFile("data/score.txt").getLines().toList
  11.  
  12. //2、切分数据
  13. val scoreArr: List[Array[String]] = lines.map(line => line.split(","))
  14.  
  15. //3、过滤脏数据
  16. val scoreFilter: List[Array[String]] = scoreArr.filter(arr => arr.length == 3)
  17. //scoreFilter.foreach(println)
  18. //4、取出学号和分数
  19. val scoFilter: List[(String, String, Int)] = scoreFilter.map {
  20. case Array(id: String, subject: String, sco: String) =>
  21. (id, subject, sco.toInt)
  22. }
  23. //5.学号分组
  24. val scoGroupBy: Map[String, List[(String, String, Int)]] = scoFilter.groupBy(kv => kv._1)
  25.  
  26. //6.计算学生总分
  27. val sSos: List[(String, Int, List[(String, String, Int)])] = scoGroupBy.map {
  28. case (id: String, list: List[(String, String, Int)]) =>
  29. val scores: List[Int] = list.map { case (_, _, sco: Int) => sco }
  30.  
  31. val scoSum: Int = scores.sum
  32. (id, scoSum, list)
  33. }.toList
  34. val lists: List[(String, Int, List[(String, String, Int)])] = sSos.sortBy(kv => -kv._2)
  35. val top10: List[(String, Int, List[(String, String, Int)])] = lists.take(10)
  36. top10.foreach(println)
  37. }
  38. }

  1. 4、统计总分大于年级平均分的学生
  1. import com.shujia.spark.util.HdfsUtil
  2. import org.apache.spark.rdd.RDD
  3. import org.apache.spark.{SparkConf, SparkContext}
  4.  
  5. //统计总分大于年级平均分的学生
  6. //平均总分=学生总分/学生人数
  7. object Test2ScoreAvg {
  8. def main(args: Array[String]): Unit = {
  9. val conf = new SparkConf()
  10. conf.setAppName("AVG")
  11. // conf.setMaster("local")
  12. val sc = new SparkContext(conf)
  13.  
  14. //读取文件切分过滤脏数据
  15. val scoFilter: RDD[Array[String]] = sc.textFile("/data/student/score.txt").map(_.split(",")).filter(_.length == 3)
  16. //提取分数出来
  17. val scoRDD: RDD[(String, Int)] = scoFilter.map {
  18. case Array(id: String, _, sco: String) =>
  19. (id, sco.toInt)
  20. }
  21. //按照学生学号进行分组
  22. val scoGroRDD: RDD[(String, Iterable[(String, Int)])] = scoRDD.groupBy(_._1)
  23. //暂存缓存中,提高速率
  24. scoRDD.cache()
  25. //计算学生的总分
  26. val sumStusRDD: RDD[(String, Int)] = scoRDD.reduceByKey(_ + _)
  27. //计算年级的总分
  28. val sumNJ: Double = sumStusRDD.map(_._2).sum
  29. //计算年级的平均总分
  30. val avgSum: Double = sumNJ / scoGroRDD.count
  31. //过滤总分大于平均分的数据
  32. val avgtoSum: RDD[(String, Int)] = sumStusRDD.filter { case (_, sco: Int) => sco >= avgSum }
  33. val l1: Long = avgtoSum.count()
  34. println(s"大于平均分有$l1+人,平均分是:$avgSum")
  35. // avgtoSum.foreach(println)
  36. HdfsUtil.delete("/data/sum_avgToSum")
  37. avgtoSum.saveAsTextFile("/data/sum_avgToSum")
  38. }
  39.  
  40. }


  1. 5、统计每科都及格的学生
  1. package shujia
  2.  
  3. import scala.collection.immutable
  4. import scala.io.Source
  5.  
  6. //3、统计每科都及格的学生
  7. object Test5_60fen {
  8. def main(args: Array[String]): Unit = {
  9. //读取文件
  10. val list: List[String] = Source.fromFile("data/score.txt").getLines().toList
  11. // list.foreach(println)
  12. //按照逗号分割
  13. val listSplit: List[Array[String]] = list.map(line => line.split(","))
  14. // listSplit.foreach(println)
  15. //过滤数据
  16. val listFilter: List[Array[String]] = listSplit.filter(line => line.length == 3)
  17. //提取数据,过滤分数大于60的人
  18. // listFilter.foreach(println)
  19. val listFilter2: List[Array[String]] = listFilter.filter(sco => sco.last.toInt - (60) >= 0)
  20. //listFilter2.foreach(println)
  21. val lists: List[(String, String, Int)] = listFilter2.map {
  22. case Array(id: String, sub: String, sco: String) =>
  23. (id, sub, sco.toInt)
  24. }
  25. //按照学号分组
  26. val listGroup: Map[String, List[(String, String, Int)]] = lists.groupBy(line => line._1)
  27.  
  28. val list1: List[(String, List[(String, String, Int)])] = listGroup.map((kv: (String, List[(String, String, Int)])) => {
  29. val id: String = kv._1
  30. val count: List[(String, String, Int)] = kv._2
  31.  
  32. (id, count)
  33. }).toList
  34.  
  35. list1.foreach(println)
  36. }
  37. }

  1. 6、统计偏科最严重的前100名学生
  1. package com.shujia.scala
  2.  
  3. import scala.collection.immutable
  4. import scala.io.Source
  5.  
  6. object Demo31Student {
  7. def main(args: Array[String]): Unit = {
  8. /**
  9. * 4、统计偏科最严重的前100名学生
  10. *
  11. * 偏科评估的标准: 方差
  12. */
  13.  
  14. //1、读取分数
  15. val lines: List[String] = Source.fromFile("data/score.txt").getLines().toList
  16.  
  17. //2、切分数据
  18. val scoreArr: List[Array[String]] = lines.map(line => line.split(","))
  19.  
  20. //3、过滤脏数据
  21. val scoreFilter: List[Array[String]] = scoreArr.filter(arr => arr.length == 3)
  22.  
  23. //4、取出学号和分数
  24. val idAndScore: List[(String, Int)] = scoreFilter.map {
  25. case Array(id: String, _, sco: String) =>
  26. (id, sco.toInt)
  27. }
  28.  
  29. //5、按照学号分组
  30. val groupBy: Map[String, List[(String, Int)]] = idAndScore.groupBy(kv => kv._1)
  31.  
  32. //计算方差
  33. val std: List[(String, Double, List[(String, Int)])] = groupBy.map {
  34. case (id: String, list: List[(String, Int)]) =>
  35. //一个学生所有的分数
  36. val scores: List[Int] = list.map { case (_, sco: Int) => sco }
  37.  
  38. /**
  39. * 计算方差
  40. * 1、计算总数
  41. * 2、计算平均值
  42. * 3、计算方差
  43. *
  44. */
  45. //科目数
  46. val N: Double = scores.length.toDouble
  47. //平均数
  48. val avg: Double = scores.sum / N
  49.  
  50. //计算方差
  51. val std: Double = scores.map((sco: Int) => (sco - avg) * (sco - avg)).sum / N
  52.  
  53. (id, std, list)
  54. }.toList
  55.  
  56. //按照方差排序,取前100
  57. val sortByStd: List[(String, Double, List[(String, Int)])] = std.sortBy(kv => -kv._2)
  58.  
  59. //取前100
  60. val top10: List[(String, Double, List[(String, Int)])] = sortByStd.take(100)
  61.  
  62. top10.foreach(println)
  63. }
  64.  
  65. }

Scala 练习题 学生分数案例的更多相关文章

  1. 吴裕雄--天生自然HADOOP操作实验学习笔记:hbase学生选课案例

    实验目的 复习hbase的shell操作和javaAPI操作 了解javaWeb项目的MVC设计 学会dao(数据库访问对象)和service层的代码编写规范 学会设计hbase表格 实验原理 前面我 ...

  2. shell脚本,计算学生分数的题目。

    1.计算学生平均分数的值是多少? 2.计算每门课都大于80分的学生姓名.3.计算每门课都小于90分的学生姓名.

  3. 借助DBHelper实现学生管理案例分析

    一.案例功能的实现 数据: --专业 create table ProfessionInfo ( ProfessionID int primary key identity(1,1), --专业编号 ...

  4. scala练习题1 基础知识

    1, 在scala REPL中输入3. 然后按下tab键,有哪些方法可以被调用? 24个方法可以被调用, 8个基本类型: 基本的操作符, 等:     2,在scala REPL中,计算3的平方根,然 ...

  5. vue实现简单学生信息管理案例

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  6. scala练习题--万年历

     使用方法去完成 import scala.io.StdIn object work1 { def main(args: Array[String]): Unit = { // 1.先输出提示语句,并 ...

  7. PHP0011:学生信息管理案例

    PHP中 html js 混合用

  8. 面向对象案例-学生信息管理系统V0.6

    更新版本 面向对象案例 - 学生信息管理系统V1.0 项目要求: 实体类: 学生类: id, 姓名,年龄,性别,成绩 需要使用数组保存学生信息 Student[] allStu 需要完成的方法 1. ...

  9. 面向对象案例-学生信息管理系统V1.1

    1.学生类 package com.qfedu.student.entity; /** * 学生类实体 * * @author GGGXXC * */ public class Student { p ...

随机推荐

  1. 审计 Linux 系统的操作行为的 5 种方案对比

    点击上方"开源Linux",选择"设为星标" 回复"学习"获取独家整理的学习资料! 很多时候我们为了安全审计或者故障跟踪排错,可能会记录分析 ...

  2. 深度好文:Linux文件系统剖析

    一个执着于技术的公众号 Linux 文件系统体系结构是一个对复杂系统进行抽象化的有趣例子.通过使用一组通用的 API 函数,Linux 可以在许多种存储设备上支持许多种文件系统.例如,read 函数调 ...

  3. go convert slice to struct

    Question: in golang how to convert slice to struct scene 1:use reflect convert slice to struct func ...

  4. Linux下使用ssh测试端口是否开启

    当服务器上不允许使用telnet时,可以使用ssh测试远程服务器端口是否开启 具体命令如下 -v 显示连接debug信息 -p port 指定端口 ssh -v -p 80 root@192.168. ...

  5. 华为OPS,自定义命令,动态执行命令

     OPS     开放可编程系统OPS(Open Programmability System)是指设备通过提供统一的应用程序接口API(Application Programming Interfa ...

  6. 解决 docker 日志占满磁盘导致 docker 服务停止的问题

    #进入 root 模式 sudo -i # 查看目录大小 sudo du -h --max-depth=1 # 应该会定位到这个目录 `/var/libs/docker/containers` # 最 ...

  7. 选择器补充与CSS属性

    目录 伪元素选择器 选择器优先级 CSS属性 宽和高 字体样式 文字属性 背景属性 边框属性 display属性 盒子模型 浮动(float) 清除浮动 伪元素选择器 伪元素选择器可以通过CSS操作文 ...

  8. 利用SignalR创建即时消息

    1. 什么是SignalR? SignalR 是一个及时消息推送,它与.NET 的 WCF ,WebAPI类似 是客户端和服务器进行消息交换的一种工具 2.SignalR 的作用? 它可以实时同步在线 ...

  9. R数据分析:如何简洁高效地展示统计结果

    之前给大家写过一篇数据清洗的文章,解决的问题是你拿到原始数据后如何快速地对数据进行处理,处理到你基本上可以拿来分析的地步,其中介绍了如何选变量如何筛选个案,变量重新编码,如何去重,如何替换缺失值,如何 ...

  10. 剖析虚幻渲染体系(15)- XR专题

    目录 15.1 本篇概述 15.1.1 本篇内容 15.1.2 XR概念 15.1.2.1 VR 15.1.2.2 AR 15.1.2.3 MR 15.1.2.4 XR 15.1.3 XR综述 15. ...