在Java中如何编写成绩排名统计程序_Java排序算法项目解析

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

成绩数据怎么存才方便后续排序

直接用 ArrayList 最稳妥,别图省事用两个平行数组(比如一个存姓名、一个存分数),后期排序时极易错位。每个 Student 对象至少包含 namescore 字段,建议实现 Comparable 接口,或准备一个外部 Comparator —— 后者更灵活,比如以后要按姓名升序、分数降序混合排名时不用改类定义。

Collections.sort() 还是 Arrays.sort()

取决于你用的是集合还是数组:

  • ArrayListLinkedList → 用 Collections.sort(list, comparator)
  • Student[] 数组 → 用 Arrays.sort(array, comparator)

两者底层都调用 Timsort,稳定且高效;别手写冒泡或选择排序——成绩数据哪怕只有几百条,手写低效排序在真实项目里会被直接拒收。注意:如果 scoredouble 类型,比较时别用 == 判相等,要用 Double.compare(a, b),否则 NaN 或精度误差会导致排序错乱。

同分情况怎么处理并列名次

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)
  • 名次列没对齐,尤其当人数超三位数(如第1

    00名),数字宽度突变影响可读性,加个 String.format("%3d", rank) 更稳妥

真正上线的统计程序,往往卡在这些看似琐碎的输出细节上,而不是排序本身。