之前遇到一个问题,一直困扰着。我的业务是:
map1 ->(100003,1),(100004,2),(100006,2)
map2 ->(100003,3),(100006,5)
map3 ->(100004,1),(100005,1)
根据相同的键合并为表格:
100003 | 1 | 3 | 0 |
100004 | 2 | 0 | 1 |
100005 | 0 | 0 | 1 |
100006 | 2 | 0 | 0 |
当时一直很纠结,虽然最后处理出来,但是中间过程很绕,如果有更简单的方法,请提供,谢谢!
思路(根据上面的map1,map2,map3来举例):
1.map中数据可能会有重复,分别遍历map,相同键相加值,放入一个List<Map>中。
2.循环list,map1,map2,map3分别对比,如果有相同的key -> continue;若不相同,则put(key,0)
扫描二维码关注公众号,回复:
9568878 查看本文章
3.去除list中相同的数据,通过set,新的List<Map>接收
4.整理新的List<Map>,用Map<Integer,List>来接收最后的数据,Integer为我所需要的key,list则是后面所对应的值
可能我写的思路不是特别清晰,所以下面贴各个思路的代码:
第一步:
List<Map<Integer ,Integer>> listMap = new ArrayList<Map<Integer,Integer>>();//接收相同键值相加的map
Map<Integer, Integer> resultPhonesMap = new HashMap<Integer,Integer>();//中间map,处理相同键值相加
Iterator<Map.Entry<Integer,Integer>> it = phonesMap.entrySet().iterator();//相当于上面内容中的map1
while(it.hasNext()){//遍历map1
Map.Entry<Integer, Integer> entry = it.next();
int key = entry.getKey();
int value = entry.getValue();
if(resultPhonesMap.containsKey(key)){//如果map包含相同的key
int phonesTimes = resultPhonesMap.get(key);//得到key所对应的值
phonesTimes += value;//进行相加
resultPhonesMap.replace(key, phonesTimes);//替换map中之前的值
}else{//如果不包含
resultPhonesMap.put(key, value);//则放入之前的key和之前的值
}
}
listMap.add(resultPhonesMap);//中间处理map放入List<Map>中
第二步:
for(int i = 0;i< listMap.size();i++){//循环List<Map>
Map<Integer, Integer> map2 = listMap.get(i);//获取list中每一个map
Iterator<Integer> result = map2.keySet().iterator();
while (result.hasNext()) {//进行遍历
Integer key = result.next();
if(!resultPhonesMap.containsKey(key)){//map1不包含当前key,则put(key,0)
resultPhonesMap.put(key, 0);
listMap.add(resultPhonesMap);
}else if(!resultOpenAccountMoreMap.containsKey(key)){//map2
resultOpenAccountMoreMap.put(key, 0);
listMap.add(resultOpenAccountMoreMap);
}else if(!resultRemoteMap.containsKey(key)){//map3
resultRemoteMap.put(key, 0); listMap.add(resultRemoteMap); } } }
第三步:
Set set = new HashSet(); //set:去除list中重复数据
List<Map> newList = new ArrayList<Map>(); //接收无重复数据的map
for (Map map:listMap) {
if(set.add(map)){
newList.add(map);
}
}
第四步:
Map<Integer, List> map = new HashMap<>(); //返回最后结果
for (Map m : newList) {//循环上面新的List<Map>
Iterator<Integer> result = m.keySet().iterator();
while (result.hasNext()) {//遍历数据
Integer key = result.next();
if (!map.containsKey(key)) {//如果不包含key
List newList1 = new ArrayList<>();
newList1.add(m.get(key)); //list中添加数据
map.put(key, newList1); //key,list
} else {//包含key,则添加key对应的值
map.get(key).add(m.get(key));
}
}
}