Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $YECBGYFECGEAFWHA as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2

Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $BBWFDDBHHYHDXXAB as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2
Java Stream API:高效处理和排序学生成绩数据_创想鸟

Java Stream API:高效处理和排序学生成绩数据

Java Stream API:高效处理和排序学生成绩数据

本文深入探讨如何利用Java Stream API高效处理学生成绩数据。我们将学习如何收集、计算学生平均分,并在此基础上进行过滤和降序排序,最终以指定格式输出结果。文章强调通过预计算平均分来优化性能,并利用Stream API的强大功能简化代码逻辑。

1. 数据收集与初始存储

在处理学生成绩数据时,通常需要将每个学生的多个成绩关联起来。一个常见的做法是使用 map<string, list> 来存储,其中键是学生姓名(string),值是该学生所有成绩的列表(list<double)。

以下代码片段展示了如何从标准输入读取学生姓名和成绩,并将其存储到 Map 中:

import java.util.*;import java.util.stream.Collectors;public class Main {    public static void main(String[] args) {        Scanner scanner = new Scanner(System.in);        int n = Integer.parseInt(scanner.nextLine()); // 读取学生-成绩对的数量        Map<String, List> records = new HashMap();        // 循环读取数据并存储        while(n > 0){            String name = scanner.nextLine();            double grade = Double.parseDouble(scanner.nextLine());            // 如果学生不存在,则添加新列表;否则,将成绩添加到现有列表            records.putIfAbsent(name, new ArrayList());            records.get(name).add(grade);            n--;        }        // ... 后续处理    }}

2. Stream API处理的挑战与优化思路

在处理完原始数据后,我们需要执行以下操作:

计算每个学生的平均分。过滤掉平均分低于特定阈值(例如 4.50)的学生。根据平均分进行降序排序。以指定格式打印结果。

最初的实现可能会在 filter 和 sorted 操作中多次计算平均分,这会导致性能下降。例如,在 sorted 操作的 Comparator 中再次计算平均分,不仅冗余,而且将 double 类型的差值强制转换为 int ((int) (average2 – average1)) 可能导致排序不准确,因为小数部分的差异会被截断。

为了解决这个问题,最佳实践是预先计算并存储平均分。我们可以将原始的 Map<String, List> 转换为 Map,其中键是学生姓名,值是其对应的平均分。

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

3. 预计算学生平均分

使用 Java Stream API 的 Collectors.toMap 可以优雅地完成这一转换:

// 将原始记录转换为包含平均分的MapMap recordsWithAverage = records.entrySet()    .stream()    .collect(Collectors.toMap(        Map.Entry::getKey, // 使用原始Map的键作为新Map的键(学生姓名)        e -> e.getValue().stream().mapToDouble(x -> x).average().orElse(0.0) // 计算平均分,如果列表为空则默认为0.0    ));

注意事项: average() 方法返回一个 OptionalDouble。为了避免在学生没有成绩时调用 getAsDouble() 抛出 NoSuchElementException,我们使用 orElse(0.0) 提供一个默认值(例如 0.0),尽管在本场景中,根据问题描述,每个学生都会有成绩。

Imagine By Magic Studio Imagine By Magic Studio

AI图片生成器,用文字制作图片

Imagine By Magic Studio 79 查看详情 Imagine By Magic Studio

4. 过滤、排序与输出

有了包含平均分的 recordsWithAverage 之后,后续的过滤和排序操作将变得更加高效和简洁。

// 对包含平均分的Map进行过滤、排序和输出recordsWithAverage.entrySet()    .stream()    .filter(e -> e.getValue() >= 4.50) // 过滤平均分大于或等于4.50的学生    .sorted(Map.Entry.comparingByValue(Comparator.reverseOrder())) // 按平均分降序排序    .forEach(pair -> {        // 格式化输出:姓名 -> 平均分 (保留两位小数)        System.out.printf("%s -> %.2f%n", pair.getKey(), pair.getValue());    });

代码解析:

filter(e -> e.getValue() >= 4.50):直接使用 Map.Entry 的值(即平均分)进行过滤。sorted(Map.Entry.comparingByValue(Comparator.reverseOrder())):这是排序的关键。Map.Entry.comparingByValue():这是一个方便的 Comparator 工厂方法,它会创建一个 Comparator,用于比较 Map.Entry 对象的。Comparator.reverseOrder():用于将默认的升序排序转换为降序排序。通过组合这两个方法,我们实现了按平均分降序排序,无需手动编写复杂的 lambda 表达式。forEach(pair -> System.out.printf(“%s -> %.2f%n”, pair.getKey(), pair.getValue())):遍历排序后的结果,并使用 printf 方法以指定格式输出,其中 %.2f 用于将 double 值格式化为保留两位小数的浮点数。

5. 完整代码示例

结合以上所有步骤,完整的解决方案如下:

import java.util.*;import java.util.stream.Collectors;public class Main {    public static void main(String[] args) {        Scanner scanner = new Scanner(System.in);        int n = Integer.parseInt(scanner.nextLine());        // 1. 数据收集与初始存储        Map<String, List> records = new HashMap();        while(n > 0){            String name = scanner.nextLine();            double grade = Double.parseDouble(scanner.nextLine());            records.putIfAbsent(name, new ArrayList());            records.get(name).add(grade);            n--;        }        // 2. 预计算学生平均分        Map recordsWithAverage = records.entrySet()            .stream()            .collect(Collectors.toMap(                Map.Entry::getKey,                e -> e.getValue().stream().mapToDouble(x -> x).average().orElse(0.0) // 处理空列表情况            ));        // 3. 过滤、排序与输出        recordsWithAverage.entrySet()            .stream()            .filter(e -> e.getValue() >= 4.50) // 过滤平均分            .sorted(Map.Entry.comparingByValue(Comparator.reverseOrder())) // 按平均分降序排序            .forEach(pair -> {                System.out.printf("%s -> %.2f%n", pair.getKey(), pair.getValue()); // 格式化输出            });        scanner.close(); // 关闭Scanner    }}

总结

通过本教程,我们学习了如何使用 Java Stream API 高效地处理和排序复杂数据结构。核心优化点在于:

避免重复计算: 在进行过滤和排序之前,预先计算并存储派生值(如平均分),可以显著提高性能。善用 Collectors: Collectors.toMap 等方法提供了强大的数据转换能力,能够将一种集合类型高效地转换为另一种。利用 Comparator 工具方法: Map.Entry.comparingByValue() 和 Comparator.reverseOrder() 等 Comparator 工厂方法使排序逻辑更加简洁和易读,同时避免了 double 到 int 强制类型转换可能导致的精度问题。

掌握这些技巧,将有助于您编写更高效、更具可读性的 Java Stream API 代码。

以上就是Java Stream API:高效处理和排序学生成绩数据的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/773955.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
vscode怎么运行带表单的HTML_vscode运行包含表单元素的HTML页面教程
上一篇 2025年11月26日 06:39:40
win10通知中心的消息怎么关闭_win10通知与操作中心消息关闭教程
下一篇 2025年11月26日 06:39:42

相关推荐

  • 如何在Java中理解Java I/O与NIO机制

    传统I/O是阻塞式流模型,适用于低并发场景;NIO基于缓冲区与通道,支持非阻塞和多路复用,适合高并发网络应用,核心区别在于线程模型与资源利用率。 Java中的I/O(输入/输出)与NIO(New I/O)是处理数据读写的核心机制,理解它们的区别和使用场景对开发高性能应用至关重要。传统I/O基于流模型…

    2026年9月21日
    000
  • UC浏览器网页上的文字无法选中复制怎么办 UC浏览器解决网页文字禁止复制问题

    答案:可通过开发者工具、阅读模式、打印预览、OCR识别或自定义脚本解除UC浏览器网页复制限制。具体操作依次为:开启开发者工具并执行JavaScript代码解除限制;启用阅读模式净化页面内容;使用打印预览重新渲染页面以选中文字;对截图应用OCR技术提取文本;添加书签脚本自动移除禁用选择的代码,从而实现…

    2026年9月21日
    000
  • JavaScript中的尾调用优化(TCO)在ES6中如何工作?

    尾调用是指函数的最后一个动作调用另一个函数,ES6引入尾调用优化以重用栈帧、避免内存溢出,支持真正的尾递归,如阶乘函数通过累积参数实现。 尾调用优化(Tail Call Optimization, TCO)是ES6引入的一项语言特性,目的是在特定条件下重用函数调用栈帧,避免不必要的内存增长,从而支持…

    2026年9月21日
    100
  • MySQL数据分库分表如何设计_避免性能瓶颈的方法?

    MySQL数据分库分表如何设计_避免性能瓶颈的方法?MySQL数据分库分表如何设计_避免性能瓶颈的方法?MySQL数据分库分表如何设计_避免性能瓶颈的方法?MySQL数据分库分表如何设计_避免性能瓶颈的方法?

    分库分表设计需注意分片键选择、分片数量控制、避免跨库查询及完善运维体系。一,优先选择高频查询字段作为分片键,如用户id,避免使用时间戳以防写热点;二,初期合理分片(如4~8库,每库4~8表),预留扩容空间并根据数据总量反推分片数;三,尽量避免跨库查询,可通过冗余数据、异步汇总或强制路由优化;四,配套…

    2026年9月21日 用户投稿
    000
  • 抖音蝴蝶号无人直播带货操作流程及注意事项

    抖音蝴蝶号无人直播带货操作流程及注意事项抖音蝴蝶号无人直播带货操作流程及注意事项抖音蝴蝶号无人直播带货操作流程及注意事项抖音蝴蝶号无人直播带货操作流程及注意事项

    “抖音蝴蝶号无人直播带货”是一种通过自动化或半自动化技术实现的直播销售模式。①其核心在于摆脱真人主播限制,实现24小时不间断直播,提升效率与流量利用率;②关键步骤包括明确账号定位与商品选择、准备高质量且丰富的内容素材、利用虚拟人或预录内容实现直播推流、结合智能客服模拟评论区互动;③优势在于降低人力成…

    2026年9月21日 用户投稿
    500
  • Java语法基础有哪些新手必学的核心知识

    掌握Java基本数据类型与变量声明,如int、double、char和boolean,并理解强类型语言特性;2. 熟悉运算符与表达式,包括算术、比较和逻辑运算符,奠定程序逻辑基础。 Java语法基础是每个初学者必须掌握的内容,只有打好根基,才能顺利进阶面向对象编程和实际项目开发。以下是新手必学的核心…

    2026年9月21日
    200
  • VSCode侧边栏怎么去掉_VSCode侧边栏隐藏教程

    隐藏VSCode侧边栏可通过Ctrl + B(Windows/Linux)或Cmd + B(macOS)快捷键快速切换,也可通过菜单栏“视图 > 外观 > 切换侧边栏可见性”或命令面板执行“View: Toggle Sidebar Visibility”实现。推荐使用快捷键操作,效率最高…

    2026年9月21日
    000
  • win10连接打印机错误0x00000709怎么办_win10打印机连接错误修复方法

    错误代码0x00000709通常因权限不足、系统更新冲突或服务异常导致共享打印机连接失败。可使用专业工具一键修复,或通过修改注册表权限、卸载KB5005569等特定更新、重启Print Spooler及相关服务,以及添加Windows凭据(如IP地址和guest账户)解决该问题。 当您在Window…

    2026年9月21日
    100
  • MobileCLIP2— 苹果开源的端侧多模态模型

    MobileCLIP2— 苹果开源的端侧多模态模型MobileCLIP2— 苹果开源的端侧多模态模型MobileCLIP2— 苹果开源的端侧多模态模型MobileCLIP2— 苹果开源的端侧多模态模型

    ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R1 模型☜☜☜ 可图大模型 可图大模型(Kolors)是快手大模型团队自研打造的文生图AI大模型 32 查看详情 MobileCLIP2是什么 mobileclip2是由苹果研究团队开发的新一代高效多模态模型,…

    2026年9月21日 用户投稿
    100
  • 如何利用蝴蝶号自动直播间打造被动收入系统

    如何利用蝴蝶号自动直播间打造被动收入系统如何利用蝴蝶号自动直播间打造被动收入系统如何利用蝴蝶号自动直播间打造被动收入系统如何利用蝴蝶号自动直播间打造被动收入系统

    要打造蝴蝶号自动直播间实现被动收入,核心在于用预设内容和智能系统替代真人出镜,构建低干预、可持续的流量转化模式。1.内容策略上选择“长寿型”内容,如软件教程、助眠音频、产品演示,并设计循环播放逻辑;2.技术搭建时优化互动设置,嵌入商品链接与自动弹幕,提升直播间活性;3.多渠道引流,结合短视频与社交媒…

    2026年9月21日 用户投稿
    000
  • MySQL用户权限体系配置思路_Sublime中编辑多用户分权管理脚本

    MySQL用户权限体系配置思路_Sublime中编辑多用户分权管理脚本MySQL用户权限体系配置思路_Sublime中编辑多用户分权管理脚本MySQL用户权限体系配置思路_Sublime中编辑多用户分权管理脚本MySQL用户权限体系配置思路_Sublime中编辑多用户分权管理脚本

    最小权限原则是mysql用户权限配置的核心,确保每个用户仅拥有必要权限以提升安全性与可维护性。1.明确需求:根据用户角色分配如只读、增删改查或结构修改权限;2.创建用户并编写sql脚本进行权限管理,替代手动输入命令,提高效率与一致性;3.使用sublime text等编辑器提升脚本编写效率,利用语法…

    2026年9月21日 用户投稿
    000
  • mac怎么在菜单栏显示日期_Mac菜单栏显示日期方法

    首先启用菜单栏时钟显示,进入系统设置→控制中心→日期与时间→开启“在菜单栏中显示”;接着在“桌面与程序坞”→“时钟”中勾选“显示日期”以显示星期和具体日期,可选开启24小时制或秒数;若设置未生效,可通过终端执行killall SystemUIServer命令强制刷新菜单栏。 如果您发现Mac的菜单栏…

    2026年9月21日
    200
  • 音乐文件占用空间太多怎么办_音乐文件占用空间太多如何整理详细指南

    解决音乐文件占空间问题的关键是压缩与整理:先用软件或在线工具降低比特率压缩体积,再按场景分类、利用元数据自动归集,并通过听歌片段和BPM判断保留内容,避免重复与误删。 音乐文件占空间太多,核心解决办法就两条:一是压缩单个文件体积,二是通过有效分类管理提升使用效率。直接删歌不是长久之计,学会整理和优化…

    2026年9月21日
    000
  • Via浏览器在鸿蒙系统上运行会闪退怎么办_Via浏览器鸿蒙系统闪退的解决方法

    Via浏览器闪退可依次尝试清除缓存数据、更新或重装应用、检查系统更新与存储空间、禁用硬件加速功能,必要时通过开发者模式启用USB调试并使用DevEco Studio捕获日志定位问题。 如果您在使用Via浏览器访问网页时,应用突然关闭或无法正常启动,则可能是由于软件兼容性或系统资源问题导致。以下是解决…

    2026年9月21日
    300
  • 升级X86架构性能大提升!极空间Z2 Ultra图赏

    升级X86架构性能大提升!极空间Z2 Ultra图赏升级X86架构性能大提升!极空间Z2 Ultra图赏升级X86架构性能大提升!极空间Z2 Ultra图赏升级X86架构性能大提升!极空间Z2 Ultra图赏

    10月23日,极空间正式推出全新双盘位nas产品——极空间z2 ultra,官方售价为1899元,参与国家补贴后仅需1457元,性价比进一步提升。 此次发布的Z2 Ultra最大的亮点在于采用X86架构处理器,相较以往使用的ARM平台,性能实现飞跃式提升,运行速度显著加快。更重要的是,新架构对Doc…

    2026年9月21日 用户投稿
    200
  • 数据库分库分表(Sharding)策略

    在现代应用程序中,随着数据量的增长,单一数据库的性能和容量往往难以满足需求。这时,数据库分库分表(Sharding)策略就成了一个关键的解决方案。那么,如何设计和实现一个有效的分库分表策略呢?让我们深入探讨一下。 在我的职业生涯中,我曾多次参与大型项目的数据库优化,其中分库分表是常见的挑战之一。我记…

    2026年9月21日
    000
  • 抖音电商与独立商城怎么结合?流量互通与转化全攻略

    许多自建电商平台的运营者正积极探索与抖音电商的合作路径,以期借助其庞大的用户基数实现流量增长和销售转化提升。虽然抖音能为独立商城导入可观的新用户,但要真正实现高效联动,必须依赖技术系统的深度对接与精准的内容运营策略。以下是抖音与独立商城融合的关键路径及实操建议。 如何实现抖音与独立商城的店铺互通? …

    2026年9月21日
    100
  • 如何在Java中实现个人财务管理工具

    首先设计Transaction、FinanceManager和Budget核心类,实现交易记录、统计分析与预算控制功能,通过ArrayList管理数据,使用LocalDate处理日期,结合ObjectOutputStream持久化存储,初期采用Scanner构建控制台菜单实现增删查改与报表展示,后期…

    2026年9月21日
    000
  • Linux目录结构学习常见问题汇总

    Linux目录结构学习常见问题汇总Linux目录结构学习常见问题汇总Linux目录结构学习常见问题汇总Linux目录结构学习常见问题汇总

    Linux只有一个根目录,所有设备挂载于此,形成统一树状结构。根目录下各路径分工明确:/bin和/sbin分别存放用户与管理员命令;/etc集中配置文件;/home为用户家目录;/var存储日志等动态数据;/tmp用于临时文件;/usr存放系统程序,/usr/local供手动安装软件;/dev包含设…

    2026年9月21日 用户投稿
    000
  • win10无法创建新的分区提示空间不足怎么办 _Win10 无法创建分区空间不足解决方法

    首先检查磁盘是否存在未分配空间,若无则通过压缩卷释放空间;使用磁盘管理或第三方工具如EaseUS创建新分区;必要时清理磁盘或转换MBR为GPT格式以突破分区限制。 如果您在使用Windows 10系统时尝试创建新的磁盘分区,但系统提示“无法创建新分区”或“空间不足”,这通常是因为当前磁盘未分配的空间…

    2026年9月21日
    100

发表回复

登录后才能评论
关注微信