Scala文件读写案例:成绩分析

score.txt内容如下

复制代码
姓名,语文,数学,英语,java
张伟,87,92,88,89
李娜,90,85,95,89
王强,78,90,82,89
赵敏,92,88,91,89
孙涛,85,82,89,89
周梅,88,87,93,89
吴刚,80,85,86,89
郑洁,91,89,94,89
陈晨,83,84,88,89
林峰,86,91,87,89
Scala 复制代码
package test33
import java.io.PrintWriter
import scala.collection.mutable.ListBuffer
import scala.io.Source
case class Student(
                    name:String,
                    yuwen:Int,
                    shuxue:Int,
                    yingyu:Int,
                    java:Int,
                    zongfen: Int,
                    pinjunfen:Int,
                    var mingci:Int)
object test {
  def main(args: Array[String]): Unit = {
    //    0. 准备一个空的List
    val list = ListBuffer[Student]()
    //    1. 读入文件 - 按行读取
    // drop(1) 让迭代器跳过一个元素,因为第一行是表头,把第一行跳过去
    val it = Source.fromFile("score.txt").getLines().drop(1)
    // 跳过一个元素
    while(it.hasNext){
      val arr = it.next().split(",")
      val total = arr(1).toInt + arr(2).toInt + arr(3).toInt + arr(4).toInt
      // 3. 添加学生到List
      list +=Student(arr(0), arr(1).toInt,arr(2).toInt, arr(3).toInt, arr(4).toInt,total,total / 3, 0)
    }
    val orderList = list.sortWith((a, b) => a.zongfen > b.zongfen)
    //    对有序的列表,从前开始向后一一比较:
    //    (1) 如果当前的分数不等于预设分数,则名次 +1, 更新预设分数
    //    (2)  如果当前的分数等于预设分数,则名次不变
    var curScore = -1
    var mingci = 0;
    for (elem <- orderList) {
      if (elem.zongfen != curScore) {
        mingci += 1
        elem.mingci = mingci
        curScore = elem.zongfen
      } else {
        elem.mingci = mingci
      }
    }
    // 4. 排名
    // 根据总分排名,取前三名
    val li1 = list.sortWith((a,b)=>a.zongfen > b.zongfen)
    //li1.foreach(println)
    // 按语文排名,取前三名
    val li2 = list.sortWith((a, b) => a.yuwen > b.yuwen).slice(0, 3)
    li2.foreach(println)
    // 5. 写入
    val writer = new PrintWriter("排名之后的结果.txt")
    // 所有的成绩
    list.foreach(s => {
      writer.println(s"姓名:${s.name}, 名次:${s.mingci},语文: ${s.yuwen}, 数学: ${s.shuxue}, 英语: ${s.yingyu},  java: ${s.java}, 总分:${s.zongfen}, 平均分:${s.pinjunfen}")
    })
    writer.println("-"*40)
    li1.foreach(s => {
      writer.println(s"姓名:${s.name},  总分:${s.zongfen}")
    })
    writer.println("-" * 40 + "语文前三名")
    li2.foreach(s => {
      writer.println(s"姓名:${s.name},  语文: ${s.yuwen},总分:${s.zongfen}")
    })
    writer.close() // 结束输出
  }
}
相关推荐
是阿威啊2 天前
【用户行为归因分析项目】- 【企业级项目开发第五站】数据采集并加载到hive表
大数据·数据仓库·hive·hadoop·spark·scala
是阿威啊5 天前
【用户行为归因分析项目】- 【企业级项目开发第四站】模拟三类用户行为数据上传到Hadoop
大数据·hadoop·分布式·sql·scala
今天没有盐7 天前
Python字符串操作全解析:从基础定义到高级格式化
后端·scala·编程语言
是阿威啊8 天前
【用户行为归因分析项目】- 【企业级项目开发第一站】项目架构和需求设计
大数据·hive·hadoop·架构·spark·scala
代码于老总10 天前
【Scala 技巧】用隐式类给 String “开挂”:一行代码实现手机号 / 身份证号校验
scala
scala舔狗汪10 天前
scala的隐式对象和隐式类
scala
是阿威啊11 天前
【maap-analysis】spark离线数仓项目完整的开发流程
大数据·分布式·spark·scala
豚踢兔x15 天前
正则表达式应用-手机号打码
scala
代码于老总17 天前
正则表达式在 Scala 中的应用
scala
凯新生物22 天前
聚乙二醇二生物素,Biotin-PEG-Biotin在生物检测中的应用
scala·bash·laravel·perl