案例:现在需要对班级学生的成绩(姓名,语文,数学,英语)做统一的规范化处理,内容保存。任务如下:
- 计算每个同学的总分和平均分
- 统计每个科目的平均分
- 列出总分前3名和单科前3名,并保存结果到文件中
学生的成绩示例:
姓名,语文,数学,英语
张伟,87,92,88
李娜,90,85,95
王强,78,90,82
步骤
分成三步来完成按行读入,并拆分。
(1)组装对象数组
(2)对对象数组做数据处理
(3)保存结果到文件
一.按行读取文本文件
我们可以一次读入一行,以下是读取文件并打印每一行的示例:
import scala.io.Source
object SourceReadExample {
def main(args: Array[String]) {
val source = Source.fromFile("input.txt")
for (line <- source.getLines()) {
println(line)
}
source.close()
}}
二.组装数据对象
思路:定义case class 分别去new 对象,并赋值
case class Student(name:String, yuwen:Double, shuxue: Double, yingyu:Double)
val source = Source.fromFile("input.txt")
for (line <- source.getLines()) {
val(name, yuwen, shuxue, yingyu) = line.split(",")
stuList += Student(name, yuwen, shuxue, yingyu)
}
}
分析数据
任务1:计算每个人的总分和平均分
for(s <-studentList) {
total = s.yuwen + s.shuxue + s.yingyu
avg = total / 3
}
任务2:统计每个科目的平均分
思路:
(1)对List中的每个学生,使用foreach计算每门课程的成绩
(2)除以总数
任务3:列出总分前3名和单科前3名
思路:对数组进行三次不同的排序,对应得到三个不同的排序数组。
操作:使用sortBy函数进行排序
package Luwenzhen
import java.io.FileWriter
object wenjian16 {
case class Stu(name:String,yuwen:Double,shuxue:Double,yingyu:Double,zongfen:Double)
def main(args: Array[String]): Unit = {
//1.读出项目根目录下的score.txt文件
val lines=scala.io.Source.fromFile("score.txt").getLines()
//跳过第一行,它表示表头
lines.next()
//按行读取
val stuList=scala.collection.mutable.ListBuffer[Stu]()
while(lines.hasNext){
val line=lines.next()
val list=line.split(",")
val total=list(1).toDouble+list(2).toDouble+list(3).toDouble
// println(s"姓名:${list(0)}")
// println(s"语文:${list(1)}")
// println(s"数学:${list(2)}")
// println(s"英语:${list(3)}")
stuList+=Stu(list(0),list(1).toDouble,list(2).toDouble,list(3).toDouble,total)
}
//3.写入结果到新的文件
val fileWriter=new FileWriter("score_result.txt")
//总分降序排序输出
fileWriter.write(s"xxxxx班级成绩分析表\n\n")
stuList.sortBy(_.zongfen).reverse.foreach(stu=>{
val avg=stu.zongfen/3
fileWriter.write((s"${stu.name},语文:${stu.yuwen}分 英语:${stu.yingyu}分 总分:${stu.zongfen} 平均分:${avg}\n"))
})
stuList.foreach(stu=>{
val total=stu.yingyu+stu.shuxue+stu.yuwen
val avg=total/3
fileWriter.write((s"${stu.name},语文:${stu.yuwen}分 数学:${stu.yingyu}分 总分:${total} 平均分:${avg}\n"))
})
//输出各学科平均分
fileWriter.write(s"英语平均分:${stuList.map(_.yingyu).sum/stuList.length} 数学平均分:${stuList.map(_.shuxue).sum/stuList.length} 语文平均分:${stuList.map(_.yuwen).sum/stuList.length} \n")
//输出英语最高分
fileWriter.write(s"英语最高分:${stuList.map(_.yingyu).max} 数学平均分:${stuList.map(_.shuxue).max} 语文平均分:${stuList.map(_.yuwen).max} \n")
fileWriter.close()
}
}