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

作为一名刚进公司实习的小白,在做一个模块的小功能时碰到了一个问题:
例如利用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循环以及我那预存的并发修改异常问题

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值