文件读写-成绩分析(二)

34 阅读1分钟

(四)分析数据

任务1:计算每个人的总分和平均分

// 读取信息结束
stuList.foreach(stu => {
  val total = stu.yuwen+stu.shuxue+stu.yinyu
  fileWriter.write(s"${stu.name},总分: ${total},平均分: ${total/3} \n")
  println(s"${stu.name}写入成功")
})
fileWriter.close()
结果:

屏幕截图 2025-12-17 153931.png

任务2:计算单科最高分

// 计算单科最高分
fileWriter.write("最高分 \n")
fileWriter.write(s"语文: ${stuList.map(_.yuwen).max} \n")
fileWriter.write(s"数学: ${stuList.map(_.shuxue).max} \n")
fileWriter.write(s"英语: ${stuList.map(_.yinyu).max} \n")
结果:
最高分 
语文: 100.0 
数学: 98.0 
英语: 96.0 

任务3:写出单科最高分的学生名字

// 计算单科最高分
fileWriter.write("最高分 \n")
val yuwen_max = stuList.map(_.yuwen).max
fileWriter.write(s"语文: ${yuwen_max} \n")
fileWriter.write(s"${stuList.filter(_.yuwen == yuwen_max).map(_.name).mkString(",")} \n")


val shuxue_max = stuList.map(_.shuxue).max
fileWriter.write(s"数学: ${shuxue_max} \n")
fileWriter.write(s"${stuList.filter(_.shuxue == shuxue_max).map(_.name).mkString(",")} \n")

val yinyu_max = stuList.map(_.yinyu).max
fileWriter.write(s"英语: ${yinyu_max} \n")
fileWriter.write(s"${stuList.filter(_.yinyu == yinyu_max).map(_.name).mkString(",")} \n")
结果:
最高分 
语文: 100.0 
小花,小明 
数学: 98.0 
小花 
英语: 96.0 
小花,小明 

(五)保存结果

就是把前面计算得到的结果,重新写入到一个全新的文件,这个功能在前面的课程中学习过,直接写出即可。

// 3. 写入一个新的文件
val fileWriter = new FileWriter("score_result.txt")

全部代码

package score

import java.io.FileWriter

/*
* 任务
* 1. 读入根目录下的score.txt文件
*    使用getlines来以行为单位读取内容
* 2. 计算
*    (1)每个同学的总分
*    (2)平均分
*    (3) 求单科最高分,学生名字
*
* 3. 把计算结果写入到score_result.txt文件中
*
* */

object score01 {
  
  case class Stu(name:String,yuwen:Double,shuxue:Double,yinyu:Double)
  def main(args: Array[String]): Unit = {
    
    // 定义一个可变列表
    val stuList = scala.collection.mutable.ListBuffer[Stu]()
    // 1. 按照行为单位,一个一个去读入文件
    val lines = scala.io.Source.fromFile("score.txt").getLines()

    // 跳过第一行,第一行是表头
    lines.next()

    while(lines.hasNext){
      val line = lines.next()
      val list = line.split(",")

      stuList += Stu(list(0),list(1).toDouble,list(2).toDouble,list(3).toDouble )

    }

    // 3. 写入一个新的文件
    val fileWriter = new FileWriter("score_result.txt")

    // 读取信息结束
    stuList.foreach(stu => {
      val total = stu.yuwen+stu.shuxue+stu.yinyu
      fileWriter.write(s"${stu.name},总分: ${total},平均分: ${total/3},单科最高分: \n")
      println(s"${stu.name}写入成功")
    })

    // 计算单科最高分
    fileWriter.write("最高分 \n")
    val yuwen_max = stuList.map(_.yuwen).max
    fileWriter.write(s"语文: ${yuwen_max} \n")
    fileWriter.write(s"${stuList.filter(_.yuwen == yuwen_max).map(_.name).mkString(",")} \n")


    val shuxue_max = stuList.map(_.shuxue).max
    fileWriter.write(s"数学: ${shuxue_max} \n")
    fileWriter.write(s"${stuList.filter(_.shuxue == shuxue_max).map(_.name).mkString(",")} \n")

    val yinyu_max = stuList.map(_.yinyu).max
    fileWriter.write(s"英语: ${yinyu_max} \n")
    fileWriter.write(s"${stuList.filter(_.yinyu == yinyu_max).map(_.name).mkString(",")} \n")


    fileWriter.close()

  }

}

结果:

张伟,总分: 267.0,平均分: 89.0,单科最高分: 
李娜,总分: 270.0,平均分: 90.0,单科最高分: 
王强,总分: 250.0,平均分: 83.33333333333333,单科最高分: 
小花,总分: 294.0,平均分: 98.0,单科最高分: 
小明,总分: 291.0,平均分: 97.0,单科最高分: 
最高分 
语文: 100.0 
小花,小明 
数学: 98.0 
小花 
英语: 96.0 
小花,小明