用ArrayList存成绩最稳妥,Student类应含name和score并实现Comparable或用Comparator;排序用Collections.sort()或Arrays.sort()(底层Timsort);double比较用Double.compare();同分需遍历设并列名次。

成绩数据怎么存才方便后续排序
直接用 ArrayList 最稳妥,别图省事用两个平行数组(比如一个存姓名、一个存分数),后期排序时极易错位。每个 Student 对象至少包含 name 和 score 字段,建议实现 Comparable 接口,或准备一个外部 Comparator —— 后者更灵活,比如以后要按姓名升序、分数降序混合排名时不用改类定义。
用 Collections.sort() 还是 Arrays.sort()
取决于你用的是集合还是数组:
- 用
ArrayList或LinkedList→ 用Collections.sort(list, comparator) - 用
Student[]数组 → 用Arrays.sort(array, comparator)
两者底层都调用 Timsort,稳定且高效;别手写冒泡或选择排序——成绩数据哪怕只有几百条,手写低效排序在真实项目里会被直接拒收。注意:如果 score 是 double 类型,比较时别用 == 判相等,要用 Double.compare(a, b),否则 NaN 或精度误差会导致排序错乱。
同分情况怎么处理并列名次
Java 原生排序只管顺序,不管“第几名”。排完序后必须遍历一次打上真实名次。关键逻辑是:当前分数和上一个人一样,名次就不加一。
立即学习“Java免费学习笔记(深入)”;
int rank = 1;
double lastScore = students.get(0).getScore();
students.get(0).setRank(rank);
for (int i = 1; i < students.size(); i++) {
double currentScore = students.get(i).getScore();
if (currentScore != lastScore) {
rank = i + 1; // 注意:不是 rank++
lastScore = currentScore;
}
students.get(i).setRank(rank);
}
这里 rank = i + 1 是核心,不是 rank++。因为索引从 0 开始,第 0 名是第 1 名,第 1 名如果是同分就还是第 1 名,只有分数变化才更新为当前索引+1。
输出带格式的排名表时容易漏掉什么
控制台打印看着整齐,但导出 CSV 或对接前端时,常忽略三件事:
- 中文字段名没设 UTF-8 编码,导致 Excel 打开乱码(写文件时用
new OutputStreamWriter(file, "UTF-8")) - 分数保留小数位不统一,比如有人 89.5,有人 90.00 —— 建议统一用
String.format("%.2f", score) - 名次列没对齐,尤其当人数超三位数(如第100名),数字宽度突变影响可读性,加个
String.format("%3d", rank)更稳妥
真正上线的统计程序,往往卡在这些看似琐碎的输出细节上,而不是排序本身。










