练习
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
class Practice1 {
var students: List[Student] = _
var score: List[Score] = _
var cource: List[Cource] = _
@Before
def read_file(): Unit = {
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 = 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 = 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)
}
@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)
}
@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
def um_score_top10_stu: Unit = {
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)
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)
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 => {
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
val scores: List[Score] = scomap(s.id).map(_._2)
scores.map(sco => {
val sub_id: String = sco.sub_id
val score_sc: Int = sco.score_sc
val sub_name: String = submap(sub_id)
tuples.append((id, name, clazz, sub_name, score_sc))
})
tuples
})
result.foreach(println)
}
@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)
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
val stu: Student = stumap(id)
val name: String = stu.name
val clazz: String = stu.clazz
(id, name, clazz, sum_ss)
}).foreach(println)
}
@Test
def every_subject_pass: Unit = {
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
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
val scores: List[Score] = groupsc(id).map(_._2)
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
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)
})
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)
}
@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)
})
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)
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构