0

0

如何用Java实现学生成绩统计系统_Java集合排序项目解析

P粉602998670

P粉602998670

发布时间:2025-12-31 13:41:04

|

731人浏览过

|

来源于php中文网

原创

优先选 ArrayList + Collections.sort();因TreeSet无法处理同分学生且灵活性差,而ArrayList配合Comparator可精准实现分数降序、姓名升序等复合排序,并支持后续多维度动态扩展。

如何用java实现学生成绩统计系统_java集合排序项目解析

TreeSet 还是 ArrayList + Collections.sort()?看排序需求再选

成绩统计系统核心是「按分数降序」「同分按姓名升序」这类复合排序,TreeSet 表面看能自动排序,但实际不推荐——它依赖 compareTo()Comparator 且不允许重复分数(除非显式处理相等情况),而现实中多个学生完全可能同分。ArrayList 配合 Collections.sort() 更灵活、可控,也更符合业务逻辑演进需要。

实操建议:

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

  • 定义 Student 类时实现 Comparable,或单独写 Comparator,重点在 compare() 中先比 score(降序:用 b.getScore() - a.getScore()),再比 name(升序:用 a.getName().compareTo(b.getName())
  • 避免在 compareTo() 中直接返回 score 差值——若 scoredouble 类型,浮点误差会导致排序错乱,应改用 Double.compare(b.score, a.score)
  • 若后续要支持按班级、科目等多维度动态排序,用 Comparator.comparing() 链式调用(如 comparing(Student::getScore).reversed().thenComparing(Student::getName))比重写 compareTo() 更安全

Collectors.groupingBy() 统计各分数段人数时的坑

Stream 做分数段统计(如 90–100、80–89)看似一行解决,但容易忽略边界和空组问题。比如直接写 groupingBy(s -> s.getScore() / 10) 会把 90 分归到 9 组、100 分却归到 10 组,导致分段错位。

实操建议:

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

  • 用闭区间逻辑定义分段函数,例如:
    Map scoreRangeCount = students.stream()
        .collect(Collectors.groupingBy(
            s -> {
                int score = (int) Math.round(s.getScore());
                if (score >= 90) return "[90, 100]";
                else if (score >= 80) return "[80, 89]";
                else if (score >= 70) return "[70, 79]";
                else if (score >= 60) return "[60, 69]";
                else return "[0, 59]";
            },
            Collectors.counting()
        ));
  • 若需保证所有分段都出现在结果中(包括人数为 0 的),不能只靠 groupingBy,得先预定义分段列表,再用 Collectors.toMap() + computeIfAbsent() 补零
  • 注意 getScore() 返回类型:若为 Double,务必用 Math.round()intValue() 转整数再分段,否则浮点小数(如 89.9999999)会被截断成 89 导致归类错误

求平均分、最高分用 DoubleSummaryStatistics 比手写循环更稳

手动遍历求和再除以 size 看似简单,但容易漏掉空集合判空、精度丢失(如用 float 累加)、或对 null 成绩字段未防护。Java 8+ 的 DoubleSummaryStatistics 内置了线程安全、空值跳过、双精度累加等保障。

Endel.io
Endel.io

Endel是一款可以创造个性化舒缓声音的应用程序,可帮助您集中注意力、放松身心和入睡。

下载

实操建议:

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

  • 直接用 students.stream().mapToDouble(Student::getScore).summaryStatistics(),它返回的对象自带 getAverage()getMax()getMin()getCount()
  • 若成绩字段可能为 null(如缺考标记为 null),需提前过滤:.filter(s -> s.getScore() != null),否则 mapToDouble 会抛 NullPointerException
  • 不要用 OptionalDoubleorElse(0.0) 来兜底平均分——空集合时平均分无意义,应明确抛异常或返回 Optional.empty(),由上层决定如何展示

导出 Excel 时别直接拼 CSV 字符串

很多初学者用 String.join(",", ...) 拼 CSV,但学生姓名含逗号(如 “张三,男”)、成绩含小数点、甚至含换行符时,会破坏 CSV 结构,Excel 打开后列错位。

实操建议:

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

  • 用 Apache POI(org.apache.poi.xssf.usermodel.XSSFWorkbook)生成真正的 .xlsx 文件,虽稍重但格式可靠;若坚持轻量 CSV,必须按 RFC 4180 规范转义:字段含逗号、双引号、换行时,整体用双引号包裹,且内部双引号要变成两个双引号("""
  • 示例安全 CSV 行生成:
    String csvLine = String.format("\"%s\",\"%s\",%.2f",
        student.getName().replace("\"", "\"\""),
        student.getSubject().replace("\"", "\"\""),
        student.getScore());
  • 文件名含中文时,HTTP 响应头里设 Content-Disposition: attachment; filename*=UTF-8''%E5%AD%A6%E7%94%9F%E6%88%90%E7%BB%A9.csv,否则浏览器下载后可能乱码

排序逻辑和统计口径一旦定下来,后续增删字段、加筛选条件就全靠 Stream 链式调用和 Comparator 组合撑住——别为了省几行代码把比较逻辑散落在多处,那才是后期最头疼的维护点。

相关专题

更多
java
java

Java是一个通用术语,用于表示Java软件及其组件,包括“Java运行时环境 (JRE)”、“Java虚拟机 (JVM)”以及“插件”。php中文网还为大家带了Java相关下载资源、相关课程以及相关文章等内容,供大家免费下载使用。

805

2023.06.15

java正则表达式语法
java正则表达式语法

java正则表达式语法是一种模式匹配工具,它非常有用,可以在处理文本和字符串时快速地查找、替换、验证和提取特定的模式和数据。本专题提供java正则表达式语法的相关文章、下载和专题,供大家免费下载体验。

724

2023.07.05

java自学难吗
java自学难吗

Java自学并不难。Java语言相对于其他一些编程语言而言,有着较为简洁和易读的语法,本专题为大家提供java自学难吗相关的文章,大家可以免费体验。

727

2023.07.31

java配置jdk环境变量
java配置jdk环境变量

Java是一种广泛使用的高级编程语言,用于开发各种类型的应用程序。为了能够在计算机上正确运行和编译Java代码,需要正确配置Java Development Kit(JDK)环境变量。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

395

2023.08.01

java保留两位小数
java保留两位小数

Java是一种广泛应用于编程领域的高级编程语言。在Java中,保留两位小数是指在进行数值计算或输出时,限制小数部分只有两位有效数字,并将多余的位数进行四舍五入或截取。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

398

2023.08.02

java基本数据类型
java基本数据类型

java基本数据类型有:1、byte;2、short;3、int;4、long;5、float;6、double;7、char;8、boolean。本专题为大家提供java基本数据类型的相关的文章、下载、课程内容,供大家免费下载体验。

445

2023.08.02

java有什么用
java有什么用

java可以开发应用程序、移动应用、Web应用、企业级应用、嵌入式系统等方面。本专题为大家提供java有什么用的相关的文章、下载、课程内容,供大家免费下载体验。

428

2023.08.02

java在线网站
java在线网站

Java在线网站是指提供Java编程学习、实践和交流平台的网络服务。近年来,随着Java语言在软件开发领域的广泛应用,越来越多的人对Java编程感兴趣,并希望能够通过在线网站来学习和提高自己的Java编程技能。php中文网给大家带来了相关的视频、教程以及文章,欢迎大家前来学习阅读和下载。

16861

2023.08.03

php源码安装教程大全
php源码安装教程大全

本专题整合了php源码安装教程,阅读专题下面的文章了解更多详细内容。

7

2025.12.31

热门下载

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

精品课程

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

共162课时 | 10.1万人学习

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

共28课时 | 2.4万人学习

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

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号