前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >嵌套循环的优化

嵌套循环的优化

作者头像
雨临Lewis
发布于 2022-01-11 06:01:53
发布于 2022-01-11 06:01:53
2.4K0
举报
文章被收录于专栏:雨临Lewis的博客雨临Lewis的博客

需求背景

今天拿到这样一个需求:有Map A和Map B,这两个Map都持有着一个同样的key——id,其对应的value可能相同,也可能不相同。现在需要对两个Map中该key对应的value相同的键值对做些特殊的操作。

这是个很简单的需求,代码很简单,我直接一个循环里嵌套另一个循环去实现这个功能需求:

1 2 3 4 5 6

for(Map.Entry<String, String> entry : mapA.entrySet()) { //do something,需要循环10次 for(Map.Entry<String, String> entry : mapB.entrySet()){ //do something,需要循环1000次 } }

写的时候也没有考虑太多,提交代码给组长review的时候,组长表示这里的循环嵌套这样写不好,因为在实际业务中,集合B会比较大,假设mapA的size是10,mapB的size是1000,这样写就需要循环10*1000次,毕竟循环的时候需要进行一系列操作,假如有很多人同时通过ui来触发这段逻辑,就可能存在性能上的问题,对于用户来说,如果点击ui上的一个按钮需要等待个十来秒才有结果,那简直是毁灭性的用户体验。

所以遇到这种需要嵌套循环的时候,应该尽量减少循环的次数;此外,一般情况下将大循环放到内部,将小循环放在外部,也会提高性能。

一种优化思路

根据组长的建议,我可以将内部的大循环的循环次数尽量降低,原本是n*m的总循环次数,可以根据业务需求尽量拆分成n+m的总循环次数。当然,不太可能真的拆分成n+m,只是尽量往这个方向靠拢。

想要实现这个优化,就只能对内部的大循环进行分组。具体怎么分组呢?可以new一个新的map,然后按照id分组(这里是因为我的业务需求中id会重复,所以将id作为分组依据)。将id相同的数据分成一组,然后存放到一个ArrayList中;然后这个id作为key存入map里,而这个ArrayList则作为value存入map里。

假设原本内部大循环的集合size是1000,我们将其分成了10组,而外部小循环的集合size是10,那么原本的101000总循环次数就可以变形成1000+1010次。如下:

1 2 3 4 5 6 7 8 9

for(Map.Entry<String, String> entry : mapB.entrySet()){ //先对大集合Map B进行分组,并存入一个Map C中,需要循环1000次 } for(Map.Entry<String, String> entry : mapA.entrySet()) { //do something,需要循环10次 for(Map.Entry<String, String> entry : mapC.entrySet()){ //do something,需要循环10次 } }

当然了,这种优化思路是在特定的功能需求下才能实现的,具体问题具体分析,因为组长的提醒,我才知道原来嵌套循环还可以这样来优化,代码之道果然是要日积月累才行。

另外关于大循环在内小循环在外的写法的具体分析,可以看看这篇文章:for循环嵌套的效率

可惜暂时我还看不懂。。

警告

本文最后更新于 October 13, 2018,文中内容可能已过时,请谨慎使用。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018-10-132,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Python影响嵌套循环结构执行速度的因素与优化思路
在循环结构中,如果没有break语句的话,循环条件的测试次数比循环体的实际执行次数多1,最后一次测试不满足条件,循环结束。对于嵌套循环结构,在不影响结果的情况下,循环次数少的循环作为外循环时循环条件测试的总次数更少。这一点对for循环和while循环都适用。
Python小屋屋主
2024/05/22
2280
Python影响嵌套循环结构执行速度的因素与优化思路
数据结构实验哈夫曼编码算法的实现_哈夫曼编码算法的实现
哈夫曼编码(Huffman Coding),又称霍夫曼编码,是一种编码方式,可变字长编码(VLC)的一种。Huffman于1952年提出一种编码方法,该方法完全依据字符出现概率来构造异字头的平均长度最短的码字,有时称之为最佳编码,
全栈程序员站长
2022/09/23
6400
数据结构实验哈夫曼编码算法的实现_哈夫曼编码算法的实现
公司来了个新同事,把代码耗时从 26856ms 优化到了 748ms,一顿操作猛如虎!
在两张表中查找相同 ID 的数据时,许多开发者会使用两层 for 循环嵌套。这种写法效率较低,本文将介绍一种提高查找速度的优化方法。
程序员鱼皮
2025/01/11
1110
公司来了个新同事,把代码耗时从 26856ms 优化到了 748ms,一顿操作猛如虎!
【数组知识的扩展②】
getOrDefault(Object key, V defaultValue) 是 Map 接口的一个方法,它接受两个参数:
ImAileen
2024/10/23
1220
【数组知识的扩展②】
HashMap常见面试题(超全面):实现原理、扩容机制、链表何时升级为红黑树、死循环
十一、为什么我们需要hash()函数 (n-1)\&hash,而不是直接用key的hashcode直接计算下标
寻求出路的程序媛
2024/10/17
6500
HashMap常见面试题(超全面):实现原理、扩容机制、链表何时升级为红黑树、死循环
Java集合-Map
Map(java.util.Map)接口,代表着key和value间的映射,更具体地说,Java映射可以存储键和值对,一旦存储在地图中,以后就可以只使用键来查找值。Map接口不是Collection 的子接口,因此,它的行为与其他Collection 类型稍有不同。
后端码匠
2021/03/16
1.3K0
第十四届蓝桥杯集训——JavaC组第十四篇——嵌套循环
这是一个基础的嵌套循环示例,i与j相当于笛卡尔积相乘。,这里的复杂度是O(n的2次方)
红目香薰
2022/12/18
4560
第十四届蓝桥杯集训——JavaC组第十四篇——嵌套循环
List,Map多层循环嵌套Demo及其理解
我这边在之前写代码遇到多层(n*n)层循环嵌套逻辑的时候很头疼今天写一些demo来帮自己更好的理解相关内容
默 语
2024/11/20
980
List,Map多层循环嵌套Demo及其理解
List<Map<String, Object>>,Map<String,List<Map<String, Object>>>多方式循环遍历
☀️相关笔记章节: 🌹java 1.8 stream使用总结(个人总结有一些经典文章的集合) 🌹遍历 ArrayList和遍历 Map的几种方式 🌹Java对象,Map,List,Set数组等相互转换大全(详细讲解,附代码,讲解案例) 🌹List,Map多层循环嵌套Demo及其理解 🌹List,Map 三种遍历方式:(总结理解) 🌹List<Map<String, Object>>,Map<String,List<Map<String, Object>>>多方式循环遍历
默 语
2024/11/20
2390
List<Map<String, Object>>,Map<String,List<Map<String, Object>>>多方式循环遍历
【小家java】HashMap原理、TreeMap、ConcurrentHashMap的原理、性能、安全方面大解析-----看这一篇就够了
综上:lambda遍历是首选。当lambda不适用(比如一边遍历一边需要移除等等),entrySet的遍历方式是最优的方式选择。
YourBatman
2019/09/03
1.2K0
【小家java】HashMap原理、TreeMap、ConcurrentHashMap的原理、性能、安全方面大解析-----看这一篇就够了
遍历 ArrayList和遍历 Map的几种方式
☀️相关笔记章节: 🌹java 1.8 stream使用总结(个人总结有一些经典文章的集合) 🌹遍历 ArrayList和遍历 Map的几种方式 🌹Java对象,Map,List,Set数组等相互转换大全(详细讲解,附代码,讲解案例) 🌹List,Map多层循环嵌套Demo及其理解 🌹List,Map 三种遍历方式:(总结理解) 🌹List<Map<String, Object>>,Map<String,List<Map<String, Object>>>多方式循环遍历
默 语
2024/11/20
620
加速Python中嵌套循环的3种方法
在 Python 中,嵌套循环可能会导致代码运行速度较慢,尤其是当数据量较大时。以下是加速嵌套循环的三种常用方法,以及具体实现方式。
华科云商小徐
2024/12/06
1570
List,Map 三种遍历方式:(总结理解)
☀️相关笔记章节: 🌹java 1.8 stream使用总结(个人总结有一些经典文章的集合) 🌹遍历 ArrayList和遍历 Map的几种方式 🌹Java对象,Map,List,Set数组等相互转换大全(详细讲解,附代码,讲解案例) 🌹List,Map多层循环嵌套Demo及其理解 🌹List,Map 三种遍历方式:(总结理解) 🌹List<Map<String, Object>>,Map<String,List<Map<String, Object>>>多方式循环遍历
默 语
2024/11/20
3370
JAVA--Map集合详解
特点:该集合存储键(key)值(value)对,一对一对往里存,而且要保证键(key)的唯一性。
用户7886150
2021/04/25
6320
8.6练习面试题答案
1. 成员内部类:定义在类的里面,方法的外面,就称为成员内部类,使用的多一些,在类里面的,生命周期要长一些
软件小生活
2021/08/13
5120
8.6练习面试题答案
图解LeetCode——1282. 用户分组(难度:中等)
有 n 个人被分成数量未知的组。每个人都被标记为一个从 0 到 n - 1 的 唯一ID 。
爪哇缪斯
2023/05/10
2340
图解LeetCode——1282. 用户分组(难度:中等)
java集合介绍_java代码分析框架
HashMap 是 Map 接口下一个线程不安全的,基于哈希表的实现类。由于他解决哈希冲突的方式是分离链表法,也就是拉链法,因此他的数据结构是数组+链表,在 JDK8 以后,当哈希冲突严重时,HashMap 的链表会在一定条件下转为红黑树以优化查询性能,因此在 JDK8 以后,他的数据结构是数组+链表+红黑树。
全栈程序员站长
2022/09/23
7910
java集合介绍_java代码分析框架
Java基础笔记18
18.01_集合框架(Map集合概述和特点) A:Map接口概述 查看API可以知道: 将键映射到值的对象 一个映射不能包含重复的键 每个键最多只能映射到一个值 B:Map接口和Collection接口的不同 Map是双列的,Collection是单列的 Map的键唯一,Collection的子体系Set是唯一的 Map集合的数据结构值针对键有效,跟值无关;Collection集合的数据结构是针对元素有效 18.02_集合框架(Map集合的功能概述) A:Map集合的功能概述 a:添加功能 V p
dreamkong
2018/06/21
6920
常见的for循环优化方式
经常使用一些循环,进行耗时计算的操作,特别是 for 循环,它是一种重复计算的操作,如果处理不好,耗时就比较大,如果处理书写得当,将大大提高效率,下面总结几条 for 循环的常见优化方式。
程序员 NEO
2023/10/12
2630
第四阶段-Java集合框架:【第五章 Map接口】
Map是一种存储元素对的集合(元素对分别称作 键 和 值 也称键值对)它将键映射到值的对象。一个映射不能包含重复的键,并且每个键最 多只能映射到一个值。
BWH_Steven
2019/08/09
6670
推荐阅读
相关推荐
Python影响嵌套循环结构执行速度的因素与优化思路
更多 >
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档