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

1、统计班级人数
package shujia

import scala.io.Source
//1、统计班级人数
/**
* 以下所有的方法都是返回新的集合,不会修改原始的集合
* 同时以下这些方法在set集合中也有,除了sort
* foreach:遍历数据
* map:一条一条处理数据
* filter:过滤数据
* flatMap:将一行转换成多行
* sortBy:排序
* groupBy:分组
*/
object Test2 {
def main(args: Array[String]): Unit = {
//读取文件
val students: List[String] = Source.fromFile("data/score.txt").getLines().toList
//按照逗号分割 val stringses: List[Array[String]] = students.map(line => line.split(",")) //3.过滤脏数据
val listFilter: List[Array[String]] = stringses.filter(line => line.length == 3) //4.取数据
val scores: List[(String, Int)] = listFilter.map {
case Array(id: String, _: String, sco: String) =>
(id, sco.toInt)
}
//分组group
val group: Map[String, List[(String, Int)]] = scores.groupBy(word => word._1)
//统计数量 val sumScoList: Map[String, Int] = group.map {
case (id: String, list: List[(String, Int)]) =>
val sco: List[Int] = list.map { case (_, sco: Int) => sco }
val sumSco: Int = sco.sum
(id, sumSco)
}
sumScoList.foreach(println)
}
}
2、统计学生的总分
package com.shujia.scala

import scala.io.Source

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)
} }
/*
* 第二种方法,case
*/
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)
}

}
 
3、统计总分年级排名前十学生各科的分数
package shujia

import scala.io.Source

//1、统计总分年级排名前十学生各科的分数
object Test3Top10 {
def main(args: Array[String]): Unit = { //1、读取分数
val lines: List[String] = Source.fromFile("data/score.txt").getLines().toList //2、切分数据
val scoreArr: List[Array[String]] = lines.map(line => line.split(",")) //3、过滤脏数据
val scoreFilter: List[Array[String]] = scoreArr.filter(arr => arr.length == 3)
//scoreFilter.foreach(println)
//4、取出学号和分数
val scoFilter: List[(String, String, Int)] = scoreFilter.map {
case Array(id: String, subject: String, sco: String) =>
(id, subject, sco.toInt)
}
//5.学号分组
val scoGroupBy: Map[String, List[(String, String, Int)]] = scoFilter.groupBy(kv => kv._1) //6.计算学生总分
val sSos: List[(String, Int, List[(String, String, Int)])] = scoGroupBy.map {
case (id: String, list: List[(String, String, Int)]) =>
val scores: List[Int] = list.map { case (_, _, sco: Int) => sco } val scoSum: Int = scores.sum
(id, scoSum, list)
}.toList
val lists: List[(String, Int, List[(String, String, Int)])] = sSos.sortBy(kv => -kv._2)
val top10: List[(String, Int, List[(String, String, Int)])] = lists.take(10)
top10.foreach(println)
}
}

4、统计总分大于年级平均分的学生
import com.shujia.spark.util.HdfsUtil
import org.apache.spark.rdd.RDD
import org.apache.spark.{SparkConf, SparkContext} //统计总分大于年级平均分的学生
//平均总分=学生总分/学生人数
object Test2ScoreAvg {
def main(args: Array[String]): Unit = {
val conf = new SparkConf()
conf.setAppName("AVG")
// conf.setMaster("local")
val sc = new SparkContext(conf) //读取文件切分过滤脏数据
val scoFilter: RDD[Array[String]] = sc.textFile("/data/student/score.txt").map(_.split(",")).filter(_.length == 3)
//提取分数出来
val scoRDD: RDD[(String, Int)] = scoFilter.map {
case Array(id: String, _, sco: String) =>
(id, sco.toInt)
}
//按照学生学号进行分组
val scoGroRDD: RDD[(String, Iterable[(String, Int)])] = scoRDD.groupBy(_._1)
//暂存缓存中,提高速率
scoRDD.cache()
//计算学生的总分
val sumStusRDD: RDD[(String, Int)] = scoRDD.reduceByKey(_ + _)
//计算年级的总分
val sumNJ: Double = sumStusRDD.map(_._2).sum
//计算年级的平均总分
val avgSum: Double = sumNJ / scoGroRDD.count
//过滤总分大于平均分的数据
val avgtoSum: RDD[(String, Int)] = sumStusRDD.filter { case (_, sco: Int) => sco >= avgSum }
val l1: Long = avgtoSum.count()
println(s"大于平均分有$l1+人,平均分是:$avgSum")
// avgtoSum.foreach(println)
HdfsUtil.delete("/data/sum_avgToSum")
avgtoSum.saveAsTextFile("/data/sum_avgToSum")
} }


5、统计每科都及格的学生
package shujia

import scala.collection.immutable
import scala.io.Source //3、统计每科都及格的学生
object Test5_60fen {
def main(args: Array[String]): Unit = {
//读取文件
val list: List[String] = Source.fromFile("data/score.txt").getLines().toList
// list.foreach(println)
//按照逗号分割
val listSplit: List[Array[String]] = list.map(line => line.split(","))
// listSplit.foreach(println)
//过滤数据
val listFilter: List[Array[String]] = listSplit.filter(line => line.length == 3)
//提取数据,过滤分数大于60的人
// listFilter.foreach(println)
val listFilter2: List[Array[String]] = listFilter.filter(sco => sco.last.toInt - (60) >= 0)
//listFilter2.foreach(println)
val lists: List[(String, String, Int)] = listFilter2.map {
case Array(id: String, sub: String, sco: String) =>
(id, sub, sco.toInt)
}
//按照学号分组
val listGroup: Map[String, List[(String, String, Int)]] = lists.groupBy(line => line._1) val list1: List[(String, List[(String, String, Int)])] = listGroup.map((kv: (String, List[(String, String, Int)])) => {
val id: String = kv._1
val count: List[(String, String, Int)] = kv._2 (id, count)
}).toList list1.foreach(println)
}
}

6、统计偏科最严重的前100名学生
package com.shujia.scala

import scala.collection.immutable
import scala.io.Source object Demo31Student {
def main(args: Array[String]): Unit = {
/**
* 4、统计偏科最严重的前100名学生
*
* 偏科评估的标准: 方差
*/ //1、读取分数
val lines: List[String] = Source.fromFile("data/score.txt").getLines().toList //2、切分数据
val scoreArr: List[Array[String]] = lines.map(line => line.split(",")) //3、过滤脏数据
val scoreFilter: List[Array[String]] = scoreArr.filter(arr => arr.length == 3) //4、取出学号和分数
val idAndScore: List[(String, Int)] = scoreFilter.map {
case Array(id: String, _, sco: String) =>
(id, sco.toInt)
} //5、按照学号分组
val groupBy: Map[String, List[(String, Int)]] = idAndScore.groupBy(kv => kv._1) //计算方差
val std: List[(String, Double, List[(String, Int)])] = groupBy.map {
case (id: String, list: List[(String, Int)]) =>
//一个学生所有的分数
val scores: List[Int] = list.map { case (_, sco: Int) => sco } /**
* 计算方差
* 1、计算总数
* 2、计算平均值
* 3、计算方差
*
*/
//科目数
val N: Double = scores.length.toDouble
//平均数
val avg: Double = scores.sum / N //计算方差
val std: Double = scores.map((sco: Int) => (sco - avg) * (sco - avg)).sum / N (id, std, list)
}.toList //按照方差排序,取前100
val sortByStd: List[(String, Double, List[(String, Int)])] = std.sortBy(kv => -kv._2) //取前100
val top10: List[(String, Double, List[(String, Int)])] = sortByStd.take(100) top10.foreach(println)
} }

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. 【位运算】剑指offer 56. 数组中数字出现的次数

    这是一系列位运算的题目,本文将由浅入深,先从最简单的问题开始: 问题1: 一个数组中只有一个数字出现过1次,其余数字都出现过两次,请找到那个只出现1次的数字.要求时间复杂度是 \(O(n)\),空间复 ...

  2. 关闭BottomSheetDialogFragment从后台返回后的动画

    问题 显示BottomSheetDialogFragment后.将当前应用放于后台,切换到其他APP,然后再返回当前应用.此时会看到BottomSheetDialogFragment从下而上的动画再次 ...

  3. 使用BGP-blackhole解决IDC频繁遭受DDOS攻击困扰

    项目背景 该项目位于某市级BGP IDC机房,机房客户多为web业务,遭受小流量攻击(10G量级)较为频繁,针对这一现象在机房core旁路部署ADS系统,牵引异常流量清洗后进行回源,该清洗方案在此不再 ...

  4. DevOps之敏捷开发

    初步了解一下敏捷开发及其流程 1 为什么要敏捷开发? 敏捷开发描述了一套软件开发的价值和原则,在这些开发中,需求和解决方案皆通过自组织跨功能团队达成. 1.1 背景与动机 当需求的不明确性和工程实现的 ...

  5. 好客租房21-react组件的两种创建方式(函数组件)

    1使用函数创建组件 函数组件:使用js的函数或者箭头函数创建的组件 约定1:函数组件名称必须以 开头 约定2:函数组件必须有返回值 表示该组件的结构 如果返回值为null 表示不渲染任何内容 2.1使 ...

  6. 关于『Markdown』:第一弹

    关于『Markdown』:第一弹 建议缩放90%食用 声明: 在我之前已有数位大佬发布 "Markdown" 的语法知识点, 在此, 仅整理归类以及补缺, 方便阅读. 感谢 C20 ...

  7. 官方出品,比 mydumper 更快的逻辑备份工具

    mysqldump 和 mydumper 是我们常用的两个逻辑备份工具. 无论是 mysqldump 还是 mydumper 都是将备份数据通过 INSERT 的方式写入到备份文件中. 恢复时,myl ...

  8. 基于.NetCore开发博客项目 StarBlog - (11) 实现访问统计

    系列文章 基于.NetCore开发博客项目 StarBlog - (1) 为什么需要自己写一个博客? 基于.NetCore开发博客项目 StarBlog - (2) 环境准备和创建项目 基于.NetC ...

  9. php为图片添加水印

    <?php /** * 图片加水印(适用于png/jpg/gif格式) * * @author flynetcn * * @param $srcImg 原图片 * @param $waterIm ...

  10. .Net CLR GC动态获取函数头地址,C++的骚操作(慎入)

    前言: 太懒了,从没有在这里正儿八经的写过文章.看到一些人的高产,真是惭愧.决定稍微变得不那么懒.如有疏漏,请指正. .net的GC都谈的很多了,本篇主要是剑走偏锋,聊聊一些个人认为较为核心的细节方面 ...