根据map的key合并成行列表格

之前遇到一个问题,一直困扰着。我的业务是:

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));  
         }  
     }  
}  

发布了47 篇原创文章 · 获赞 10 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/fearlessnesszhang/article/details/80401716