作为一名刚进公司实习的小白,在做一个模块的小功能时碰到了一个问题:
例如利用sql从库里查到了以下数据
itemCode | region |
---|---|
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循环以及我那预存的并发修改异常问题
记录成长,共同进步,大家要是有更好的方案希望能给小弟指点一下