1 计算每个同学的总分和平均分
2 统计每个科目的平均分
3 列出总分前3名和单科前3名,并保存结果到文件中
学生的成绩示例:
姓名,语文,数学,英语
张伟,87,92,88
李娜,90,85,95
王强,78,90,82
import java.io.{FileWriter, IOException}
import scala.io.Source
import scala.util.{Try, Using}
object ScoreAnalyzer {
// 定义学生样例类
case class Stu(name: String, yuwen: Double, shuxue: Double, yingyu: Double) {
// 计算总分
def total: Double = yuwen + shuxue + yingyu
// 计算平均分
def average: Double = total / 3
}
def main(args: Array[String]): Unit = {
// 文件路径(建议使用相对路径或配置文件)
val inputPath = "D:\24大数据1班\1\src\score.txt"
val outputPath = "score_result.txt"
try {
// 读取文件并处理数据
val stuList = Using(Source.fromFile(inputPath)) { source =>
val lines = source.getLines()
// 跳过表头
if (lines.hasNext) lines.next()
// 处理每一行数据
lines.flatMap { line =>
val parts = line.split(",").map(_.trim) // 去除空格
// 数据校验
if (parts.length != 4) {
println(s"警告:数据格式错误,跳过此行: $line")
None
} else {
Try {
Stu(
name = parts(0),
yuwen = parts(1).toDouble,
shuxue = parts(2).toDouble,
yingyu = parts(3).toDouble
)
}.toOption
}
}.toList
}.getOrElse {
println("错误:读取文件失败")
List.empty[Stu]
}
if (stuList.isEmpty) {
println("错误:没有有效数据")
return
}
// 计算各科统计信息
val englishAvg = stuList.map(_.yingyu).sum / stuList.size
val mathAvg = stuList.map(_.shuxue).sum / stuList.size
val chineseAvg = stuList.map(_.yuwen).sum / stuList.size
val englishMax = stuList.maxBy(_.yingyu)
val mathMax = stuList.maxBy(_.shuxue)
val chineseMax = stuList.maxBy(_.yuwen)
// 写入结果文件(使用Using自动关闭资源)
Using(new FileWriter(outputPath)) { writer =>
// 写入每个学生的详细信息
stuList.foreach { stu =>
writer.write(
s"${stu.name},语文:${stu.yuwen}分,数学:${stu.shuxue}分,英语:${stu.yingyu}分,总分:${stu.total},平均分:${"%.2f".format(stu.average)}\n"
)
}
// 写入空行分隔
writer.write("\n")
// 写入各科平均分(保留2位小数)
writer.write(
s"英语平均分:${"%.2f".format(englishAvg)},数学平均分:${"%.2f".format(mathAvg)},语文平均分:${"%.2f".format(chineseAvg)}\n"
)
// 写入各科最高分学生信息
writer.write(
s"英语最高分:${englishMax.name}(${englishMax.yingyu}分),数学最高分:${mathMax.name}(${mathMax.shuxue}分),语文最高分:${chineseMax.name}(${chineseMax.yuwen}分)\n"
)
}.fold(
ex => println(s"写入文件失败: ${ex.getMessage}"),
_ => println("数据处理完成,结果已写入score_result.txt")
)
} catch {
case ex: IOException => println(s"文件操作错误: ${ex.getMessage}")
case ex: Exception => println(s"程序异常: ${ex.getMessage}")
}
}
}