当前位置: 首页 > article >正文

使用 HashMap 优化嵌套循环:Java 对象数组转换

本文旨在提供使用 HashMap 优化 Java 嵌套循环的有效方法特别是当循环涉及对象数组并进行相等检查时。通过将内部循环转换为 HashMap 查询可以显著降低时间复杂性提高代码性能。本文将提供详细的步骤和示例代码以帮助读者理解和应用此优化技能。包括嵌套循环在内的处理 Java 特别是当需要对两个对象列表进行比较并根据特定条件进行匹配时性能往往成为一个关键问题。 传统嵌套循环方法的时间复杂性是 O(n*m)其中 n 和 m 两个列表的长度。当列表很大时这种方法可能会变得非常耗时。本文将介绍如何使用它 HashMap 优化这类代码将时间复杂度降低到接近 O(nm)。问题描述假设我们有两个 Java Object1的对象 和 Object2。Object1 包括字符串属性和一个字符串属性 Object2 列表。我们的目标是遍历 Object1 列表为每一个 Object1 找到所有名称属性匹配的对象 Object2 对象然后把这些 Object2 对象添加到 Object1 的列表中。立即学习“Java免费学习笔记(深入)public class Object1 { String name; String xyz; ListObject2 listobject2; public String getName() { return name; } public void setlistobject2(ListObject2 listobject2) { this.listobject2 listobject2; } } public class Object2 { String name; String abc; String def; public String getName() { return name; } }实现嵌套循环的传统方法是public void fillNestedObject() { ListObject1 listobjectt1 new ArrayList(); // 假设 fetchobjects1FromApi() 从 API 获取 Object1 列表 // 实际使用时请替换为真实数据源 listobjectt1.add(new Object1(); listobjectt1.get(0).name test; ListObject2 listobject2 new ArrayList(); // 假设 fetchobjectsFromapi2 从 API 获取 Object2 列表 // 实际使用时请替换为真实数据源 Object2 obj2 new Object2(); obj2.name test; listobject2.add(obj2); for(Object1 object1 : listobjectt1){ ListObject2 tmpList new ArrayList(); for(Object2 object2 : listobject2) { if(object1.getName().equals(object2.getName())){ tmpList.add(object2); } } object1.setlistobject2(tmpList); } }使用 HashMap 优化我们可以使用上述代码进行优化 HashMap 来存储 Object2 对象以其 name 属性作为键。这样我们就可以了 O(1) 在复杂的时间内搜索和 Object1 对象匹配的 Object2 对象从而避免内部循环。以下是使用 HashMap 优化代码import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; public class NestedLoopOptimization { public void fillNestedObject() { ListObject1 listobjectt1 new ArrayList(); // 假设 fetchobjects1FromApi() 从 API 获取 Object1 列表 // 实际使用时请替换为真实数据源 Object1 obj1 new Object1(); obj1.name test; listobjectt1.add(obj1); ListObject2 listobject2 new ArrayList(); // 假设 fetchObjectfromApi2() 从 API 获取 Object2 列表 // 实际使用时请替换为真实数据源 Object2 obj2 new Object2(); obj2.name test; listobject2.add(obj2); // 创建一个 HashMap以 Object2 的 name Object2作为键的属性 对象作为值 MapString, ListObject2 object2Map new HashMap(); for (Object2 object2 : listobject2 { if (!object2Map.containsKey(object2.getName())) { object2Map.put(object2.getName(), new ArrayList()); } object2Map.get(object2.getName()).add(object2); } // 遍历 Object1 列表并使用 HashMap 查找匹配的 Object2 对象 for (Object1 object1 : listobject1 { ListObject2 tmpList object2Map.getOrDefault(object1.getName(), new ArrayList()); object1.setlistobject2(tmpList); } } }代码解释创建 HashMap: 我们先创造一个 HashMap object2Map用于存储 Object2 对象。键是 Object2 对象的 name 属性值是相同的 name 属性的 Object2 对象列表。填充 HashMap: 我们遍历 listobject2每个 Object2 对象添加到 object2Map 中。如果 object2Map 同样的存在已经存在 name 属性键则将 Object2 将对象添加到键对应的值列表中。否则创建新列表并将其添加到键对应的值列表中 Object2 将对象添加到列表中然后将键添加到列表中 object2Map 中。使用 HashMap 寻找匹配对象 我们遍历 listobject1并使用 object2Map.get(object1.getName()) 查找与 Object1 对象匹配的 Object2 对象列表。getOrDefault 该方法用于处理 object1.getName() 在 object2Map 在不存在的情况下此时返回新的空列表。设置 Object1 的 List: 最后会找到的 Object2 列表设置在相应的位置 Object1 对象的 listobject2 属性中。使用 Java 8 Stream 优化 (原答案)import java.util.*; import java.util.stream.Collectors; import java.util.stream.Stream; public class NestedLoopOptimization { public void fillNestedObject() { ListObject1 listobjectt1 new ArrayList(); // 假设 fetchobjects1FromApi() 从 API 获取 Object1 列表 // 实际使用时请替换为真实数据源 Object1 obj1 new Object1(); obj1.name test; listobjectt1.add(obj1); ListObject2 listobject2 new ArrayList(); // 假设 fetchobjectsFromapi2 从 API 获取 Object2 列表 // 实际使用时请替换为真实数据源 Object2 obj2 new Object2(); obj2.name test; listobject2.add(obj2); StreamObject1 stream1 listobjectt1.stream(); StreamObject2 stream2 listobject2.stream(); MapString, ListObject2 reduced2 Collections.unmodifiableMap( stream2.reduce(new HashMap(), (a, b) - { if (!a.containsKey(b.getName())) { a.put(b.getName(), new ArrayList()); } a.get(b.getName()).add(b); return a; }, (a, b) - b)); stream1.peek(object1 - object1.setListObject2(reduced2).get(object1.getName()))) .collect(Collectors.toList()); } }代码解释Stream 版本转换为 Stream: 首先将 listobjectt1 和 listobject2 转换为 Stream 对象。Reduce 成 Map: 使用 stream2.reduce 将 Object2 的 Stream 对象转换为一个 Map其中 key 是 Object2 的 name 属性value 是具有相同 name 属性的 Object2 对象列表类似于以前手动创建的操作。 HashMap 但是使用了这个过程 Stream 聚合操作。Collections.unmodifiableMap 用于确保 Map 不可变性。

相关文章:

使用 HashMap 优化嵌套循环:Java 对象数组转换

本文旨在提供使用 HashMap 优化 Java 嵌套循环的有效方法,特别是当循环涉及对象数组并进行相等检查时。通过将内部循环转换为 HashMap 查询可以显著降低时间复杂性,提高代码性能。本文将提供详细的步骤和示例代码,以帮助读者理解和应用此优化…...

leOS2:基于看门狗定时器的轻量级嵌入式调度器

1. leOS2:基于看门狗定时器的轻量级嵌入式调度器 leOS2(little embedded Operating System 2)是一个专为资源受限的8位AVR微控制器设计的极简实时调度器。它不依赖于通用定时器(如Timer0/Timer1),而是创造…...

手把手教你用Swaks和Gophish绕过SPF,搭建自己的邮件钓鱼测试环境(附避坑指南)

企业级邮件安全测试实战:从SPF绕过到钓鱼环境搭建 邮件安全测试已成为企业安全防护体系中不可或缺的一环。据统计,超过90%的网络攻击始于钓鱼邮件,而其中近40%的成功攻击源于SPF配置不当或完全缺失。本文将系统性地介绍如何构建一个完整的邮件…...

SEO_从零开始,手把手教你制定SEO优化方案(126 )

<h2>SEO优化的基本概念</h2> <p>SEO&#xff0c;全称Search Engine Optimization&#xff0c;是搜索引擎优化的简称&#xff0c;旨在提高网站在搜索引擎中的自然排名&#xff0c;从而增加网站的可见度和流量。对于初学者来说&#xff0c;SEO可能听起来有点复…...

别再傻傻分不清了!IM和RTC到底差在哪?从微信聊天到腾讯会议的技术选择

IM与RTC技术选型指南&#xff1a;从协议栈到商业场景的深度解析 当你的产品经理在白板上画出一个"消息气泡"和一个"视频通话图标"时&#xff0c;技术团队首先需要面对的灵魂拷问是&#xff1a;这到底该用IM架构还是RTC架构&#xff1f;2019年某在线教育初创…...

告别代码噩梦:用Awesome-Dify-Workflow零代码30分钟实现企业级登录系统

告别代码噩梦&#xff1a;用Awesome-Dify-Workflow零代码30分钟实现企业级登录系统 【免费下载链接】Awesome-Dify-Workflow 分享一些好用的 Dify DSL 工作流程&#xff0c;自用、学习两相宜。 Sharing some Dify workflows. 项目地址: https://gitcode.com/GitHub_Trending/…...

C# : 引用类型都存在堆上吗

不完全是&#xff0c;这里要精确区分&#xff1a;引用类型的实例大多数存在堆上&#xff0c;但引用本身不一定在堆上。我们拆开来说&#xff1a;引用类型本身 vs 引用变量对象实例&#xff08;类的实例&#xff09;绝大多数情况下分配在 堆上由 垃圾回收器 管理生命周期引用变量…...

ArcGIS字段值提取:别再手动截取了,用Python和VB脚本5分钟搞定

ArcGIS字段值提取&#xff1a;Python与VB脚本高效自动化方案 引言&#xff1a;告别低效手工操作 在GIS数据处理工作中&#xff0c;属性表字段值的提取是再常见不过的操作。想象一下这样的场景&#xff1a;你手头有一份包含数万条记录的行政区划数据&#xff0c;需要从"BSM…...

别再只调PID了!基于STM32C8T6的电磁循迹小车,从硬件滤波到软件算法的抗干扰全攻略

电磁循迹小车的抗干扰实战&#xff1a;从硬件滤波到软件优化的全链路解决方案 当你的电磁循迹小车在实验室里跑得风生水起&#xff0c;一到比赛现场却频频"抽风"&#xff0c;这往往不是PID参数调得不够好&#xff0c;而是整个系统的抗干扰设计存在漏洞。本文将带你深…...

Pixel Fashion Atelier企业应用:支持Webhook回调的自动化素材生成流水线搭建

Pixel Fashion Atelier企业应用&#xff1a;支持Webhook回调的自动化素材生成流水线搭建 1. 项目背景与价值 Pixel Fashion Atelier是一款基于Stable Diffusion与Anything-v5的图像生成工作站&#xff0c;专为企业级素材生产需求设计。传统AI工具往往面临两大挑战&#xff1a…...

Vue项目里用Frappe-Gantt 0.6.1做项目管理甘特图,我踩过的坑都在这了

Vue项目中集成Frappe-Gantt的避坑指南与工程化实践 在最近的一个敏捷开发项目中&#xff0c;我们需要为产品团队提供一个直观的任务进度管理工具。经过几轮技术选型&#xff0c;最终选择了Frappe-Gantt 0.6.1作为基础组件。这个选择并非一帆风顺——从最初的简单集成到最终形成…...

终极指南:5个实用技巧解决Rainmeter开发中的内存保护异常问题

终极指南&#xff1a;5个实用技巧解决Rainmeter开发中的内存保护异常问题 【免费下载链接】rainmeter Desktop customization tool for Windows 项目地址: https://gitcode.com/gh_mirrors/ra/rainmeter 在Rainmeter桌面定制工具的开发过程中&#xff0c;内存保护异常&a…...

解锁音乐格式终极指南:一键解决加密音频播放难题

解锁音乐格式终极指南&#xff1a;一键解决加密音频播放难题 【免费下载链接】unlock-music 在浏览器中解锁加密的音乐文件。原仓库&#xff1a; 1. https://github.com/unlock-music/unlock-music &#xff1b;2. https://git.unlock-music.dev/um/web 项目地址: https://gi…...

手把手教你用EFR32BG22实现BLE串口透传(附GATT配置全流程)

EFR32BG22低功耗蓝牙串口透传开发实战指南 在物联网终端设备开发中&#xff0c;蓝牙串口透传是最基础也最实用的功能之一。本文将带您深入EFR32BG22芯片的蓝牙开发世界&#xff0c;从零开始构建一个高效的BLE串口透传服务。不同于简单的代码搬运&#xff0c;我们将重点关注GATT…...

ESP32烧录全攻略:从命令行到GUI工具,新手也能轻松搞定

ESP32烧录全攻略&#xff1a;从命令行到GUI工具&#xff0c;新手也能轻松搞定 第一次接触ESP32开发板时&#xff0c;那块小小的芯片里蕴藏着无限可能&#xff0c;但如何将自己的代码"装进"这个硬件大脑却成了拦路虎。记得我最初尝试烧录时&#xff0c;面对各种专业术…...

百度快速排名优化技术(百度seo排名优化)

百度快速排名优化技术是一种针对搜索引擎结果页面&#xff08;SERP&#xff09;排名优化的技术手段&#xff0c;通过优化网站的内容、结构和用户体验等方面&#xff0c;提高网站在搜索引擎中的排名&#xff0c;从而获得更多的流量和潜在客户。下面&#xff0c;我将介绍百度快速…...

哔哩下载姬DownKyi实用指南:从新手到高手的进阶之路

哔哩下载姬DownKyi实用指南&#xff1a;从新手到高手的进阶之路 【免费下载链接】downkyi 哔哩下载姬downkyi&#xff0c;哔哩哔哩网站视频下载工具&#xff0c;支持批量下载&#xff0c;支持8K、HDR、杜比视界&#xff0c;提供工具箱&#xff08;音视频提取、去水印等&#xf…...

易语言实现阶乘与组合数计算

是的&#xff0c;我听说过易语言&#xff0c;它是一款面向中文使用者的编程语言&#xff0c;以其直观的中文语法和图形化界面开发能力而著称。 一、 数学概念解析 在深入编程实现前&#xff0c;我们先明确两个基础的数学概念。 1. 阶乘 阶乘 是所有小于及等于该数的正整数的…...

如何通过FCEUX实现NES游戏的完美模拟?超实用指南

如何通过FCEUX实现NES游戏的完美模拟&#xff1f;超实用指南 【免费下载链接】fceux FCEUX, a NES Emulator 项目地址: https://gitcode.com/gh_mirrors/fc/fceux 5个步骤3个技巧&#xff0c;让你快速掌握NES模拟器 核心价值&#xff1a;重温和探索经典游戏的最佳选择 …...

提升效率:用快马一键生成网络应用用户认证api模块

最近在开发一个网络应用时&#xff0c;遇到了用户认证模块的重复开发问题。每次新建项目都要从头写注册登录逻辑&#xff0c;不仅耗时还容易出错。后来发现了InsCode(快马)平台的智能生成功能&#xff0c;帮我快速解决了这个问题。 用户认证模块的核心需求 网络应用中&#xff…...

OpenClaw+Qwen3-VL:30B:个人多模态AI助手全流程

OpenClawQwen3-VL:30B&#xff1a;个人多模态AI助手全流程 1. 为什么选择这个组合&#xff1f; 去年冬天&#xff0c;我发现自己陷入了一个典型的知识工作者困境&#xff1a;每天要处理大量图片资料&#xff08;产品截图、会议白板照片、技术文档截图&#xff09;&#xff0c…...

ssm+java2026年毕设私人医生预约系统【源码+论文】

本系统&#xff08;程序源码&#xff09;带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容一、选题背景关于在线医疗问诊服务的研究&#xff0c;现有研究主要以综合性互联网医疗平台的宏观发展分析为主&#xff0c;专门针对基于SSM…...

2分钟搞定:Windows包管理器Winget一键安装全攻略

2分钟搞定&#xff1a;Windows包管理器Winget一键安装全攻略 【免费下载链接】winget-install Install winget tool using PowerShell! Prerequisites automatically installed. Works on Windows 10/11 and Server 2022. 项目地址: https://gitcode.com/gh_mirrors/wi/winge…...

在Windows和RV1126上部署ONNX肺部分割模型:一份OpenCV DNN与RKNN的完整对比实践

跨平台肺部分割模型部署实战&#xff1a;OpenCV DNN与RKNN技术选型指南 当医疗影像分析遇上边缘计算&#xff0c;开发者们常常面临一个关键抉择&#xff1a;如何在保证精度的前提下&#xff0c;将训练好的深度学习模型高效部署到不同计算平台&#xff1f;本文将以肺部分割模型为…...

大数据在电力行业的应用案例解析 -【电力技术】(一)—— 基于电力大客户运营的大数据落地拓展

目录 一、电力大客户运营场景与大数据价值 二、大数据平台架构(大客户运营专用) 三、落地应用案例一:电力大客户价值分群与精准画像 1. 业务目标 2. 数据宽表(工程常用) 3. 核心算法:K-Means 用户分群(简化示例代码) 4. 应用效果 四、落地应用案例二:大客户负荷…...

CSSCI论文写作03:确定论文的选题

什么是选题 选题:选择一个适合的研究指向!!! 选择: 而不是创造,创新是内在要求 你要坚信:所有的选题都有前人关注过研究过,我们不求“栽树”,只求“乘凉”,填补什么空白,只能说明自己的浅薄无知。 适合: 个人经验的学术表达,找到那双穿在自己脚上的鞋子没有不能…...

AutoDL云服务器避坑指南:从PyTorch到Jupyter,手把手搞定GPU环境配置

AutoDL云服务器GPU环境配置实战&#xff1a;从镜像选择到Jupyter避坑全攻略 第一次在AutoDL这类云GPU平台上配置深度学习环境时&#xff0c;那种既兴奋又忐忑的心情我至今记忆犹新。看着琳琅满目的镜像选项和复杂的版本匹配要求&#xff0c;稍有不慎就会陷入"版本地狱&qu…...

ReAct Agent:新手程序员必看!收藏这款融合推理与行动的AI智能体框架,轻松入门大模型应用开发

ReAct框架通过结合推理与行动&#xff0c;解决了传统提示工程的局限性&#xff0c;构建出能主动思考、决策并执行复杂任务的智能体。本文详细介绍了ReAct的核心设计思想&#xff0c;包括推理模块的动态思考链和错误回溯机制&#xff0c;以及行动模块的工具集成和环境状态感知。…...

如何用Sunshine打造个人游戏串流中心:跨设备畅玩的终极指南

如何用Sunshine打造个人游戏串流中心&#xff1a;跨设备畅玩的终极指南 【免费下载链接】Sunshine Sunshine: Sunshine是一个自托管的游戏流媒体服务器&#xff0c;支持通过Moonlight在各种设备上进行低延迟的游戏串流。 项目地址: https://gitcode.com/GitHub_Trending/su/S…...

绝区零智能协同系统:AI驱动的游戏效率倍增解决方案

绝区零智能协同系统&#xff1a;AI驱动的游戏效率倍增解决方案 【免费下载链接】ZenlessZoneZero-OneDragon 绝区零 一条龙 | 全自动 | 自动闪避 | 自动每日 | 自动空洞 | 支持手柄 项目地址: https://gitcode.com/gh_mirrors/ze/ZenlessZoneZero-OneDragon 在当代游戏生…...