在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 范围)。
- 升序排成绩:把
b和a位置换过来 - 分数相同时按姓名二次排序:链式调用
thenComparing(Student::getName) - 如果
students是null或含null元素,sort()会抛NullPointerException,得提前过滤或用Comparator.nullsLast()
用 Stream.sorted() 做不可变排名
想保留原始列表不变、只生成新排名列表?Stream 是更安全的选择。它天然支持链式操作,也更容易嵌入过滤、映射等逻辑。
示例:取前10名且分数 ≥ 60 的学生
Listtop10 = students.stream() .filter(s -> s.getScore() >= 60) .sorted((a, b) -> Double.compare(b.getScore(), a.getScore())) .limit(10) .collect(Collectors.toList());
注意:sorted() 是中间操作,必须接终端操作(如 collect、forEach)才会触发;没写 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 对象里 score 是 Double(包装类)就可能为 null,而 Double.compare(null, x) 直接炸。
安全做法是显式处理 null:用 Comparator.nullsLast() 或 nullsFirst() 包一层
ComparatorbyScore = 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 'ejs'的解决办法
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【方案】

