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
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() // 结束输出
}
}