Scala—文件读写:成绩分析

3 阅读1分钟

学生的成绩示例:

姓名,语文,数学,英语
张伟,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)}")
}

屏幕截图 2025-12-16 084445.png

三、组装数组对象

思路:定义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")

结果展示:

屏幕截图 2025-12-16 101857.png