讲师中心 微信公众号
AI工具推荐 视频效率加速

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

千辰同学_4853

千辰同学_4853

发布时间:2026-02-02 03:07:23

|

1010人浏览过

|

来源于php中文网

原创

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

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

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

直接对 List<student></student> 排序最常用,前提是 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 是更安全的选择。它天然支持链式操作,也更容易嵌入过滤、映射等逻辑。

立即学习“Java免费学习笔记(深入)”;

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

List<Student> top10 = 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,容易误判。

kashen-mysql DDLtoExcel
kashen-mysql DDLtoExcel

解析 MySQL 8.0 的 DDL 脚本,并将表结构导出为 Excel 格式。适用于用户需将 MySQL 的 `CREATE TABLE` 语句转换为结构化的 Excel 文件场景,导出内容包含字段名、数据类型、长度及精度等信息。支持多张表的批量处理,每张表对应 Excel 中的一个独立工作表。适用于数据库文档编写、数据字典生成及模式分析等任务。

下载
  • 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() 包一层

Comparator<Student> 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 名次列对不上。

热门AI工具

更多
火山引擎

火山引擎是一款面向企业的云计算与AI服务平台。

码上飞
码上飞 Hot

一款基于自然语言的AI应用开发平台,可根据用户描述自动生成应用程序,帮助个人和团队快速完成应用原型与开发。

花生AI
花生AI Hot

一款AI视频创作工具,主要用于B站推出的AI视频创作工具,适合需要提升相关任务效率的用户。

Lovart
Lovart Hot

一款面向视觉设计创作的AI设计平台,可通过智能体和画布工作流辅助制作海报、Logo、网页、PPT及其他视觉内容。

切问学术

切问学术是一款AI论文写作工具,复旦大学NLP团队推出的AI学术智能体。

超级简历WonderCV

一款AI办公效率工具,主要用于免费求职简历模版下载制作,应届生职场人必备简历制作神器,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

相关专题

更多
mybatis一级缓存和二级缓存
mybatis一级缓存和二级缓存

在MyBatis中,一级缓存和二级缓存是两种不同级别的缓存机制,它们都可以用来提高性能。本专题提供mybatis一级缓存和二级缓存相关文章,大家可以免费阅读。

583

2023.08.21

ibatis和mybatis有什么区别
ibatis和mybatis有什么区别

ibatis和mybatis的区别:1、基本信息不同;2、开发时间不同;3、功能与易用性;4、配置文件;5、入参类型与出参类型;6、返回结果集接受方式;7、语法差异;8、数据库方言支持;9、插件支持;10、社区活跃度;11、全球化支持。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2922

2024.02.23

mybatis如何配置数据库连接
mybatis如何配置数据库连接

mybatis配置数据库连接的方法:1、指定数据源;2、配置事务管理器;3、配置类型处理器和映射器;4、使用环境元素;5、配置别名。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

446

2024.02.23

mybatis工作原理及流程是什么
mybatis工作原理及流程是什么

mybatis工作原理及流程:1、配置文件;2、接口与映射;3、sql解析与生成;4、执行计划;5、结果处理;6、动态sql;7、缓存机制;8、插件;9、事务管理;10、日志与监控;11、扩展性。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

292

2024.02.23

hibernate和mybatis有哪些区别
hibernate和mybatis有哪些区别

hibernate和mybatis的区别:1、实现方式;2、性能;3、对象管理的对比;4、缓存机制。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

302

2024.02.23

Java MyBatis框架
Java MyBatis框架

本专题专注于Java主流ORM框架MyBatis的应用,系统讲解SQL映射、动态SQL、结果映射、分页查询、缓存机制与多表关联等核心内容,并结合企业管理系统、电商平台和后台管理项目实战,帮助学员全面掌握高效的数据库持久层开发技能。

6309

2025.08.26

c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

549

2023.09.22

java中null的用法
java中null的用法

在Java中,null表示一个引用类型的变量不指向任何对象。可以将null赋值给任何引用类型的变量,包括类、接口、数组、字符串等。想了解更多null的相关内容,可以阅读本专题下面的文章。

1698

2024.03.01

DBeaver怎么导入数据
DBeaver怎么导入数据

DBeaver数据导入专题,整理Excel、CSV、SQL、TXT等常见文件的数据导入方法,涵盖目标数据库选择、数据表创建、字段映射、数据类型设置及导入参数配置等操作,帮助用户将本地文件中的数据写入数据库,并了解批量导入、重复数据处理和导入失败等常见问题的解决方法。

0

2026.11.05

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Excel 教程
Excel 教程

共162课时 | 45.2万人学习

成为PHP架构师-自制PHP框架
成为PHP架构师-自制PHP框架

共28课时 | 3.6万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn