ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

还在用双层for循环?快来来试试这招吧(工作问题总结)

2022-01-28 17:58:15  阅读:111  来源: 互联网

标签:map 双层 快来 int ArrayList itemCode 武汉市 ++ 这招


作为一名刚进公司实习的小白,在做一个模块的小功能时碰到了一个问题:
例如利用sql从库里查到了以下数据

itemCoderegion
1001武汉市
1001武汉市
1001武汉市
1002青山区
1002武汉市
1002江夏区
1002蔡甸区
1003武昌区
1003东西湖区
1003经开区
1003武汉市

现在的业务需求就是:
在同一个itemCode下如果region有且仅有的话,这说明这个功能是级功能
在同一个itemCode下如果region有且仅有的话,这说明这个功能是级功能
其他情况为市区级功能
然后分别统计市,区,市区分别有多少项
现在的情况是在库里面查出来的数据有一百多万条
而我的处理方式也是很粗暴,直接双层for循环暴力分组
我先将所有的itemCode相同的所有数据划分为一组
大概就是以下这种情况(别骂,俺确实比较蠢)
数据是通过ArrayList<String[]>传到业务层的,数组第一个位置放的itemCode,第二个位置放的Region
在这里插入图片描述用这种情况的话,一百多万条数据就是要执行一百万*一百万,直接给服务器干卡住了。这还不是最夸张的,我甚至还在遍历的同时修改我遍历的数据,并发修改异常在我眼力都没有存在感了吗
然后项目负责人就让我把这块儿再优化一下,那咱小白也不会啊,左思右想面向百度编程也不会啊,然后就求助组里的老大哥,老大哥给出了一下解决方案:

			int shi = 0;
	        int qu = 0;
	        int shiqu = 0;
	        int allTatal = 0;

	        ArrayList<String[]> allPcJieruData = DAO层接收到的数据;

	        Map<String, ArrayList<String>> map = new HashMap<String, ArrayList<String>>();
	        for (int i = 0; i < allPcJieruData.size(); i++) {
	            //分组
	            String itemCode = allPcJieruData.get(i)[0];
	            String region = allPcJieruData.get(i)[1];
	            ArrayList<String> groupList = map.get(itemCode);
	            if (groupList == null) {
	                groupList = new ArrayList<>();
	            }
	            groupList.add(region);
	            map.put(itemCode, groupList);
	        }
	        allTatal = map.size();
	        Iterator<Map.Entry<String, ArrayList<String>>> it = map.entrySet().iterator();
	        while (it.hasNext()) {
	            Map.Entry<String, ArrayList<String>> entry = it.next();
	            ArrayList<String> allist = entry.getValue();
	            Boolean isShi = false;
	            Boolean isQu = false;
	            for (int i = 0; i < allist.size(); i++) {
	                //如果全都是武汉市为市
	                //如果有市级也有区的为市区
	                //如果只有区的则为区
	                String regions = allist.get(i);
	                if (regions.equals("武汉市")) {//一旦该组中包含市,则点亮
	                	isShi = true;
	                } else {//否则表示该组中包含区,则点亮区
	                	isQu = true;
	                }
	            }
	         
	            if (isShi && isQu) {//如果有市级也有区的
	                shiqu++;
	            } else if (!isShi && isQu) {//如果只有区的则为区
	                qu++;
	            } else if (isShi && !isQu) {//如果全都是武汉市为市
	                shi++;
	            }
	        }

虽然说老大哥给出的解决方案可能没有各位正在看的大佬的解决方案优秀,但是至少比我的好太多了,最主要是避免了双层for循环以及我那预存的并发修改异常问题

记录成长,共同进步,大家要是有更好的方案希望能给小弟指点一下

标签:map,双层,快来,int,ArrayList,itemCode,武汉市,++,这招
来源: https://blog.csdn.net/DachuiStudyJava/article/details/122734195

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有