在Java里如何实现成绩排名功能_Java集合排序实战说明

发布时间 - 2026-02-02 00:00:00    点击率:
Collections.sort()排序需Student实现Comparable或传Comparator,推荐匿名Comparator;用Double.compare()防精度问题和溢出;null值用nullsLast()处理;Stream.sorted()适合不可变排序;并列名次需遍历打标。

Collections.sort() 对学生成绩列表排序

直接对 List 排序最常用,前提是 Student 实现 Comparable 或传入 Comparator。别直接改 Student 类去实现 Comparable——万一以后要按姓名、学号、年龄多维度排序,硬编码比较逻辑会失控。

推荐写匿名 Comparator 或方法引用:

Collections.sort(students, (a, b) -> Double.compare(b.getScore(), a.getScore()));

注意:这里用 Double.compare() 而不是 a.getScore() - b.getScore(),避免浮点数减法导致的精度问题或整数溢出(比如分数是 int 但值超出了 Integer.MAX_VALUE - Integer.MIN_VALUE 范围)。

  • 升序排成绩:把 ba 位置换过来
  • 分数相同时按姓名二次排序:链式调用 thenComparing(Student::getName)
  • 如果 studentsnull 或含 null 元素,sort() 会抛 NullPointerException,得提前过滤或用 Comparator.nullsLast()

Stream.sorted() 做不可变排名

想保留原始列表不变、只生成新排名列表?Stream 是更安全的选择。它天然支持链式操作,也更容易嵌入过滤、映射等逻辑。

示例:取前10名且分数 ≥ 60 的学生

List top10 = students.stream()
    .filter(s -> s.getScore() >= 60)
    .sorted((a, b) -> Double.compare(b.getScore(), a.getScore()))
    .limit(10)
    .collect(Collectors.toList());

注意:sorted() 是中间操作,必须接终端操作(如 collectforEach)才会触发;没写 collect 就以为排好序了,结果是空的 Stream,容易误判。

  • sorted() 底层仍调用 Arrays.sort(),性能和 Collections.sort() 接近,不是懒加载
  • 如果数据量极大(比如十万级),Stream 默认串行,不加 parallel() 不会自动并行,别指望它“自动加速”
  • method reference 写排序器更简洁:sorted(Comparator.comparingDouble(Student::getScore).reversed())

处理并列排名(同分同名次)的逻辑怎么写

真实成绩单里“95、95、92”应该显示为“1、1、3”,而不是“1、2、3”。Java 集合排序本身不提供这种名次计算,得自己遍历打标。

关键点:不能只依赖排序后索引(i + 1),必须比对相邻分数是否相等:

int rank = 1;
for (int i = 0; i < rankedStudents.size(); i++) {
    Student s = rankedStudents.get(i);
    if (i > 0 && Double.compare(s.getScore(), rankedStudents.get(i-1).getScore()) == 0) {
        s.setRank(rank); // 分数相同,名次不变
    } else {
        rank = i + 1;
        s.setRank(rank);
    }
}

这里用 Double.compare() 判断相等,而非 ==,防止浮点误差;如果分数字段是 BigDecimal,就得用 compareTo()

  • 别在 sort() 里试图塞进名次逻辑——排序器只能返回 -1/0/1,没法传状态
  • 如果要输出“1、1、3、4、4、6”这种跳名次(即并列后下一个名次跳过占用位),上面代码已满足;若要“1、1、2、3、3、4”这种连续名次,把 rank = i + 1 改成 rank++ 即可
  • 并发环境下做排名需额外同步,单线程场景不用加锁

成绩字段为 null 时排序崩溃怎么办

NullPointerException 是最常踩的坑。哪怕数据库字段允许为空,Java 对象里 scoreDouble(包装类)就可能为 null,而 Double.compare(null, x) 直接炸。

安全做法是显式处理 null:用 Comparator.nullsLast()nullsFirst() 包一层

Comparator byScore = Comparator.comparing(
    Student::getScore, 
    Comparator.nullsLast(Comparator.reverseOrder())
);

这样 null 成绩会被排在最后(降序时),且不会抛异常。

如果业务要求 null 当作 0 处理,就该在 getScore() 里返回 Objects.requireNonNullElse(score, 0.0),而不是在排序器里硬转——职责要分明。

  • 别依赖 IDE 自动生成的 compareTo(比如 Lombok 的 @Data),它对 null 字段默认抛异常
  • MyBatis 等 ORM 框架查出的 null 值,有时会变成 0.0 或空字符串,取决于类型处理器,务必实测
  • 单元测试一定要覆盖 score = null 场景,否则上线后第一份零分名单就崩

排名功能看着简单,真正落地时 null 值、浮点精度、并列规则、原始数据不可变这几个点,漏掉任何一个都可能让导出的 Excel 名次列对不上。


# excel  # java  # 处理器  # seo  # 编码  # 懒加载  # stream  # mybatis  # Integer  # NULL  # sort  # foreach  # 字符串  # int  # double  # 线程  # 并发  # 对象  # ide  # 数据库  # 链式  # 浮点  # 遍历  # 零分  # 多维  # 而不是  # 升序  # 看着  # 是在  # 才会 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Laravel怎么配置自定义表前缀_Laravel数据库迁移与Eloquent表名映射【步骤】  如何用手机制作网站和网页,手机移动端的网站能制作成中英双语的吗?  JavaScript模板引擎Template.js使用详解  如何正确选择百度移动适配建站域名?  网站制作公司哪里好做,成都网站制作公司哪家做得比较好,更正规?  DeepSeek是免费使用的吗 DeepSeek收费模式与Pro版本功能详解  iOS中将个别页面强制横屏其他页面竖屏  Laravel Blade模板引擎语法_Laravel Blade布局继承用法  如何在沈阳梯子盘古建站优化SEO排名与功能模块?  Bootstrap整体框架之CSS12栅格系统  微信小程序 require机制详解及实例代码  如何在腾讯云服务器上快速搭建个人网站?  Laravel如何使用Blade组件和插槽?(Component代码示例)  深圳网站制作公司好吗,在深圳找工作哪个网站最好啊?  千库网官网入口推荐 千库网设计创意平台入口  IOS倒计时设置UIButton标题title的抖动问题  香港服务器网站生成指南:免费资源整合与高速稳定配置方案  Claude怎样写约束型提示词_Claude约束提示词写法【教程】  Laravel distinct去重查询_Laravel Eloquent去重方法  node.js报错:Cannot find module &#39;ejs&#39;的解决办法  javascript如何操作浏览器历史记录_怎样实现无刷新导航  利用vue写todolist单页应用  Laravel队列由Redis驱动怎么配置_Laravel Redis队列使用教程  Windows家庭版如何开启组策略(gpedit.msc)?(安装方法)  东莞专业网站制作公司有哪些,东莞招聘网站哪个好?  详解Nginx + Tomcat 反向代理 如何在高效的在一台服务器部署多个站点  如何用AI一键生成爆款短视频文案?小红书AI文案写作指令【教程】  Android自定义listview布局实现上拉加载下拉刷新功能  Laravel storage目录权限问题_Laravel文件写入权限设置  青岛网站建设如何选择本地服务器?  LinuxCD持续部署教程_自动发布与回滚机制  详解Android——蓝牙技术 带你实现终端间数据传输  Swift中switch语句区间和元组模式匹配  Laravel如何实现用户角色和权限系统_Laravel角色权限管理机制  Laravel怎么配置不同环境的数据库_Laravel本地测试与生产环境动态切换【方法】  实现点击下箭头变上箭头来回切换的两种方法【推荐】  电商网站制作多少钱一个,电子商务公司的网站制作费用计入什么科目?  如何在服务器上配置二级域名建站?  Laravel如何实现API版本控制_Laravel API版本化路由设计策略  在线制作视频网站免费,都有哪些好的动漫网站?  公司门户网站制作流程,华为官网怎么做?  php嵌入式断网后怎么恢复_php检测网络重连并恢复硬件控制【操作】  Laravel怎么配置S3云存储驱动_Laravel集成阿里云OSS或AWS S3存储桶【教程】  Laravel Admin后台管理框架推荐_Laravel快速开发后台工具  如何在云主机快速搭建网站站点?  Laravel DB事务怎么使用_Laravel数据库事务回滚操作  python中快速进行多个字符替换的方法小结  Android中Textview和图片同行显示(文字超出用省略号,图片自动靠右边)  ,网页ppt怎么弄成自己的ppt?  Laravel如何实现数据导出到CSV文件_Laravel原生流式输出大数据量CSV【方案】