学生的成绩示例:
姓名,语文,数学,英语
张伟,87,92,88
李娜,90,85,95
王强,78,90,82
一、任务分析
分成三步来完成按行读入,并拆分。
(1)组装对象数组
(2)对对象数组做数据处理
(3)保存结果到文件。
二、按行读取文本文件
由于一行表示一条数据,所以,我们可以一次读入一行。
// 按行读取
for(line <- lines){
println(line)
- 跳过第一行,它表示表头
- 语文,数学,英语
lines.next()
while(lines.hasNext){
val line = lines.next()
val list = line.split(",")
println(s"姓名: ${list(0)}")
println(s"语文: ${list(1)}")
println(s"数学: ${list(2)}")
println(s"英语: ${list(3)}")
}
三、组装数组对象
思路:定义case class ,分别去new 对象,并赋值。
case class Stu(name:String, yuwen:Double, shuxue:Double, yingyu:Double)
def main(args: Array[String]): Unit = {
// 1.读出项目跟目录下的score.txt文件
// lines 就是迭代器
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(",")
stuList += Stu(list(0), list(1).toDouble, list(2).toDouble, list(3).toDouble)
}
stuList.foreach(stu => {
println(s"${stu.name}, 数学:${stu.shuxue}分")
})
}
四、分析数据
计算每个人的总分和平均分:
stuList.foreach(stu => {
val total = stu.yingyu + stu.shuxue + stu.yuwen
val avg = total / 3
fileWriter.write(s"${stu.name}, 语文:${stu.yuwen}分 数学:${stu.shuxue}分 英语:${stu.yingyu}分 总分: ${total} 平均分: ${avg}\n")
})
- 单科平均分:
fileWriter.write(s"英语平均分:${stuList.map(_.yingyu).sum / stuList.length} 数学平均分:${stuList.map(_.yingyu).sum / stuList.length} 语文平均分:${stuList.map(_.yingyu).sum / stuList.length} \n")
- 最高分:
fileWriter.write(s"英语最高分:${stuList.map(_.yingyu).max} 数学最高分:${stuList.map(_.shuxue).max} 语文最高分:${stuList.map(_.yuwen).max} \n")
五、保存结果
把前面计算得到的结果,重新写入到一个全新的文件,这个功能在前面的课程中学习过,直接写出即可。
// 3 写入结果到新的文件
val fileWriter = new FileWriter("score_result.txt")
结果展示: