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

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

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

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

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

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

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

	        ArrayList allPcJieruData = DAO层接收到的数据;

	        Map> map = new HashMap>();
	        for (int i = 0; i < allPcJieruData.size(); i++) {
	            //分组
	            String itemCode = allPcJieruData.get(i)[0];
	            String region = allPcJieruData.get(i)[1];
	            ArrayList groupList = map.get(itemCode);
	            if (groupList == null) {
	                groupList = new ArrayList<>();
	            }
	            groupList.add(region);
	            map.put(itemCode, groupList);
	        }
	        allTatal = map.size();
	        Iterator>> it = map.entrySet().iterator();
	        while (it.hasNext()) {
	            Map.Entry> entry = it.next();
	            ArrayList 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循环以及我那预存的并发修改异常问题

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

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5719818.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-18
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存