练习

package scala_01.practice

import org.junit.{Before, Test}

import scala.collection.immutable
import scala.collection.immutable.StringOps
import scala.collection.mutable.ListBuffer
import scala.io.Source /**
* 1、统计班级人数
* 2、统计学生的总分
*/ class Practice1 { var students: List[Student] = _
var score: List[Score] = _
var cource: List[Cource] = _ @Before
def read_file(): Unit = {
// 读取students.txt数据
// 这里路径不能是 scala/data/students.txt
students = Source.fromFile("data/students.txt")
.getLines()
.toList
.map(s => {
val spilts: Array[String] = s.split(",")
val id: String = spilts(0)
val name: String = spilts(1)
val age: Int = spilts(2).toInt
val gender: String = spilts(3)
val clazz: String = spilts(4)
Student(id, name, age, gender, clazz)
}) // 读取Score.txt数据
score = Source.fromFile("data/score.txt")
.getLines()
.toList
.map(s => {
val splits: Array[String] = s.split(",")
val id: String = splits(0)
val sub_id: String = splits(1)
val score_sc: Int = splits(2).toInt
Score(id, sub_id, score_sc)
}) // 读取Cource.txt数据
cource = Source.fromFile("data/cource.txt")
.getLines()
.toList
.map(s => {
val splits: Array[String] = s.split(",")
val sub_id: String = splits(0)
val sub_name: String = splits(1)
val score_max: Int = splits(2).toInt
Cource(sub_id, sub_name, score_max)
}) } @Test
def printAll: Unit = {
students.take(10).foreach(println)
score.take(10).foreach(println)
cource.take(10).foreach(println)
} // 1、统计班级人数
@Test
def count_students: Unit = {
val count_stu: Map[String, Int] = students
.groupBy(s => s.clazz)
.map(kv => (kv._1, kv._2.size))
count_stu.foreach(println) } // 2、统计学生的总分
@Test
def sum_score: Unit = {
val sum_sc: Map[String, Int] = score.groupBy(s => s.id)
.map(kv => {
val id: String = kv._1
val score_sc: List[Score] = kv._2
val sum_s = score_sc.map(s => s.score_sc).sum
(id, sum_s)
}) sum_sc.foreach(println)
} @Test
// 1、统计年级排名前十学生各科的分数 [学号,学生姓名,学生班级,科目名,分数]
def um_score_top10_stu: Unit = { //先拿到排名前十的学生id
val top10ids: List[String] = score.groupBy(s => s.id)
.map(kv => {
val id: String = kv._1
val score_sc: List[Score] = kv._2
val sum_s = score_sc.map(s => s.score_sc).sum
(id, sum_s)
}).toList
.sortBy(s => (-s._2)) // 按照总分倒序排列
.take(10)
.map(s => s._1) // 直接取出id // 将score转成kv格式的Map集合
// 将id作为key Score对象作为value
val scomap: Map[String, List[(String, Score)]] = score.map(kv => {
val id: String = kv.id
val values: Score = kv
(id, values)
}).groupBy(kv => kv._1) // 将cource_id作为key cource_name作为value 构建subMap
val submap: Map[String, String] = cource.map(s => (s.sub_id, s.sub_name)).toMap val result: List[(String, String, String, String, Int)] = students.filter(s => {
top10ids.contains(s.id)
}).flatMap(s => {
// 初始化一个ListBuffer用于保留最后的结果
// ListBuffer中每个元素的类型是一个5元组(同题目需要的5列结果类型一一对应) val tuples: ListBuffer[(String, String, String, String, Int)] = ListBuffer[(String, String, String, String, Int)]()
val id: String = s.id
val name: String = s.name
val clazz: String = s.clazz
// 根据学生id从scoMap中将该学生的6门科目的分数取出来 得到一个Score对象构成的List
val scores: List[Score] = scomap(s.id).map(_._2)
// 遍历每个学生的6门科目成绩
scores.map(sco => {
val sub_id: String = sco.sub_id
val score_sc: Int = sco.score_sc
// 根据科目id从subMap中取出科目名称
val sub_name: String = submap(sub_id)
tuples.append((id, name, clazz, sub_name, score_sc))
})
tuples
})
result.foreach(println)
} // 2、统计总分大于年级平均分的学生 [学号,姓名,班级,总分]
@Test
def sum_score_beyond_avg: Unit = { // 年级的总分拿过来
val sum_sc: Map[String, Int] = score.groupBy(s => s.id)
.map(kv => {
val id: String = kv._1
val score_sc: List[Score] = kv._2
val sum_s = score_sc.map(s => s.score_sc).sum
(id, sum_s)
})
// 计算年级平均分
val bigsum: Int = sum_sc.map(_._2).sum
val avg: Double = bigsum / (sum_sc.size.toDouble)
println(avg) // 以学生id作为key Students对象最为value 构建stuMap
val stumap: Map[String, Student] = students.map(s => (s.id, s)).toMap sum_sc.filter(kv => kv._2 > avg) // 过滤出成绩大于年级平均分的学生
.map(kv => {
val id: String = kv._1
val sum_ss: Int = kv._2
// 根据学生id从stuMap中提取出学生信息
val stu: Student = stumap(id)
val name: String = stu.name
val clazz: String = stu.clazz
(id, name, clazz, sum_ss)
}).foreach(println) } // 3、统计每科都及格的学生 [学号,姓名,班级,科目,分数]
@Test
def every_subject_pass: Unit = {
// 每门科目的及格分数Map
// k:科目id v:二元组(科目名称,科目及格分数)
val sub_pass_map: Map[String, (String, Double)] = cource.map(s => {
val id: String = s.sub_id
val sub_name: String = s.sub_name
val pass_score: Double = (s.score_max) * 0.6
(id, (sub_name, pass_score))
}).toMap // 所有6门科目都及格的学生id
val pass_id: List[String] = score
.filter(s => s.score_sc > sub_pass_map(s.sub_id)._2)
.groupBy(kv => kv.id)
.map(kv => (kv._1, kv._2.size))
.filter(s => s._2 == 6)
.map(s => s._1)
.toList val groupsc: Map[String, List[(String, Score)]] = score.map(s => (s.id, s)).groupBy(_._1) students.filter(s => pass_id.contains(s.id))
.map(s => {
val lb: ListBuffer[(String, String, String, String, Int)] = ListBuffer[(String, String, String, String, Int)]() val id: String = s.id
val name = s.name
val clazz = s.clazz // 根据学生id从scoMap中将该学生的6门科目的分数取出来 得到一个Score对象构成的List
val scores: List[Score] = groupsc(id).map(_._2)
// 遍历每个学生的6门科目成绩
scores.map(s => {
val score_sc: Int = s.score_sc
val sub_id: String = s.sub_id
val sub_name: String = sub_pass_map(sub_id)._1 lb.append((id, name, clazz, sub_name, score_sc)) })
lb }).foreach(println) } @Test
// 4、统计每个班级的前三名 [学号,姓名,班级,分数]
def clazz_sum_score_top3: Unit = { // 学生总分
val id_sum_core: Map[String, Int] = score.groupBy(s => s.id)
.map(kv => {
val id: String = kv._1
val sum_sc: Int = kv._2.map(s => s.score_sc).sum
(id, sum_sc)
}) // 根据学生id 从id_sum_score中获取学生总分
students.map(s => (s.id, s.name, s.clazz, id_sum_core(s.id)))
.groupBy(s => s._3)
.flatMap(kv => {
val clazz: String = kv._1
val stuList: List[(String, String, String, Int)] = kv._2
val top3: List[(String, String, String, Int)] = stuList.sortBy(s => s._4)
.take(3) top3
}).foreach(println) } // 5、统计偏科最严重的前100名学生 [学号,姓名,班级,科目,分数]
@Test
def unbalanceTop100: Unit ={ val cour_map: Map[String, Int] = cource.map(s => {
val sub_id: String = s.sub_id
val score_max: Int = s.score_max
(sub_id, score_max)
}).toMap //每个学生的百分制分数
val per_score: List[(String, Double)] = score.map(s => {
val id: String = s.id
val score_sc: Int = s.score_sc
val sub_id: String = s.sub_id
val score_max: Int = cour_map(sub_id)
val per_sco: Double = (score_sc / score_max.toDouble) * 100
(id, per_sco)
}) //学生平均分
val stu_avg: Map[String, Double] = per_score.groupBy(s => s._1)
.map(kv => {
val id: String = kv._1
val values: List[(String, Double)] = kv._2
val sum: Double = values.map(s => s._2).sum
val avg: Double = sum / values.size.toDouble
(id, avg)
}) // 求100位方差
val top100: List[String] = per_score.map(kv => {
val id: String = kv._1
val per_sco: Double = kv._2
val avg: Double = stu_avg(id)
val fenzi: Double = math.pow((avg - per_sco), 2)
(id, fenzi)
}).groupBy(_._1)
.map(kv => {
val id: String = kv._1
val size: Int = kv._2.size
val fancha: Double = kv._2.map(_._2).sum / size
(id, fancha)
}).toList
.sortBy(-_._2)
.map(_._1)
.take(100) val cou_map: Map[String, String] = cource.map(s=>(s.sub_id,s.sub_name)).toMap val sco_map: Map[String, List[Score]] = score.groupBy(_.id) students.filter(s=>top100.contains(s.id))
.flatMap(s=>{ val tuples: ListBuffer[(String, String, String, String, Int)] = ListBuffer[(String,String,String,String,Int)]()
val id: String = s.id
val name: String = s.name
val clazz: String = s.clazz sco_map(id).foreach(s=>{
val sub_id: String = s.sub_id
val score_sc: Int = s.score_sc
val sub_name: String = cou_map(sub_id)
tuples.append((id,name,clazz,sub_name,score_sc)) }) tuples }).foreach(println) } case class Student(id: String, name: String, age: Int, gender: String, clazz: String) case class Score(id: String, sub_id: String, score_sc: Int) case class Cource(sub_id: String, sub_name: String, score_max: Int) }

Scala语法2的更多相关文章

  1. scala语法在spark withScope上的应用

    withSpout在spark中是用来做DAG可视化的,它在代码里的用法如下(以map为例,spark 2.0.0版本) def map[U: ClassTag](f: T => U): RDD ...

  2. scala语法解析(解码指环)

    看惯了JAVA的语法,再看scala的语法,有的晦涩难懂.正好遇到一个介绍scala语法的文章,就直接截图留念.省的再临时抱佛脚了.

  3. 1.scala语法

    对象的apply方法 (1)对象调用apply()方法,可省略成() (2)string对象的apply方法返回第n个字符 "hello"(4) //'o' if语句的返回值 ja ...

  4. Scala语法笔记

    JAVA中,举例你S是一个字符串,那么s(i)就是该字符串的第i个字符(s.charAt(i)).Scala中使用apply的方法 JAVA与C++的?:操作符 等同于Scala的 if ( x &g ...

  5. Java和Scala语法比较

    类型推断 挑逗指数: 四星 我们知道,Scala一向以强大的类型推断闻名于世.很多时候,我们无须关心Scala类型推断系统的存在,因为很多时候它推断的结果跟直觉是一致的. Java在2016 年也新增 ...

  6. Spark记录-Scala语法基础

    参考:http://docs.scala-lang.org/cheatsheets/index.html.http://docs.scala-lang.org/.http://www.scala-la ...

  7. Scala 语法基础

    一 简介 Scala 是一门多范式(multi-paradigm)的编程语言,设计初衷是要集成面向对象编程和函数式编程的各种特性.Scala 运行在Java虚拟机上,并兼容现有的Java程序.Scal ...

  8. Scala 语法(一)

    (1)基本语法 变量 val var(可变变量): 数据类型 Byte,Char,Int,Short,Long,String(字符),Float,Double,Boolean(true,flase). ...

  9. scala语法

    1:双重for循环(相当于j是i的内存循环):for (i <-0 to n; j <-10 to 20){ println(i);println(j)} 2:单层for循环:for (i ...

  10. Scala语法(二)

    (1)类,对象 //定义类(属性.方法),实例化对象 class counter{ *//主构造器 class counter(name:String,mode:Int){ ... } 实例化:val ...

随机推荐

  1. 如何在 pyqt 中解决国际化 tr() 函数不起作用的问题

    前言 有些时候我们在父类中使用了 self.tr('XXX'),使用 Qt Linguist 完成翻译并导出 qm 文件后,发现子类中仍然是英文原文.比如下面这段代码: class AlbumCard ...

  2. 洛谷P5019 [NOIP2018 提高组] 铺设道路

    题目描述 春春是一名道路工程师,负责铺设一条长度为 n 的道路. 铺设道路的主要工作是填平下陷的地表.整段道路可以看作是 n 块首尾相连的区域,一开始,第 i 块区域下陷的深度为 di. 春春每天可以 ...

  3. ApacheCN Pandas 教程集

    Pandas 秘籍 零.前言 一.Pandas 基础 二.数据帧基本操作 三.开始数据分析 四.选择数据子集 五.布尔索引 六.索引对齐 七.分组以进行汇总,过滤和转换 八.将数据重组为整齐的表格 九 ...

  4. Tomcat启动报错org.apache.catalina.core.StandardContext listenerStart

    感谢原文作者:西北码农 原文链接:https://blog.csdn.net/bitree1/article/details/72236633 解决方法: 1.检查配置信息有无异常:如 web.xml ...

  5. iOS App程序内多语言国际化实现 By HL

    iOS 多语言设置有很多方式可以实现,之前在做手机思埠1.0时,就对app进行了多语言设置,当时看到很多方法,比如用plist等方式保存键值对的,不过还是用Localisator来国际化最方便 1.添 ...

  6. 无脑安装java编程语言开发的集成环境 IDEA 白嫖版本

    无脑安装java编程语言开发的集成环境  IDEA 根python很类似:可以借鉴无脑安装--Python 及 安装python集成开发环境pycharm - 隐姓埋名4869 - 博客园 (cnbl ...

  7. Docker之LNMP分布式容器部署

    Docker之LNMP分布式容器部署 目录 Docker之LNMP分布式容器部署 一.项目模拟 1. 项目环境 2. 服务器环境 3. 任务需求 二.Linux系统基础镜像 三.Nginx 1. 建立 ...

  8. 【SCOI2007】组队(单调性)

    题目链接 大意 给定\(N\)个人与三个常量\(A,B,C\),每个人有两个属性:\(Hi\),\(Vi\). 现要让你选些人出来,定义\(Hmin\)为选出来的这些人中最小的\(Hi\)值,\(Vm ...

  9. Solution -「CF 908D」New Year&Arbitrary Arrangement

    \(\mathcal{Description}\)   Link.   给定 \(n,p_a,p_b\),初始有一个空串,每次操作有 \(\frac{p_a}{p_a+p_b}\) 的概率在其后添加字 ...

  10. APK修改神器:插桩工具 DexInjector

    本文介绍了一个针对Dex进行插桩的工具,讲解了一下直接修改Dalvik字节码和Dex文件时遇到的问题和解决方法 作者:字节跳动终端技术-- 李言 背景 线下场景中,我们经常需要在APK中插入一些检测代 ...