java中ListMap树形结构的集合,进行逐级汇总的抽象

1. map1中累加map2中某个指定key的值(针对数值类型)

(1)如果map1中不存在key对应的值,则把map2中对应key的值添加进map1中;
(2)否则,map1中存在的值,和map2中存在的值,进行累加。代码如下所示:

   public static void addMapSameKey(Map<String, Object> map1, Map<String, Object> map2, String key) {

        if (map1.get(key) == null) {
            // 如果map1 中,指定的key值为空的时候,赋值为map2中对应的的key值元素。
            map1.put(key, map2.get(key));
        } else {
            // 否则,累加map2中对应的key值元素到map1.
            BigDecimal d1 = new BigDecimal(map1.get(key).toString());
            BigDecimal d2 = new BigDecimal(map2.get(key) == null ? "0" : map2.get(key).toString());
            map1.put(key, d1.add(d2));
        }
    }

(3)适用场景
该方法对map的累加进行了抽象,抽象后,可以作为一个基本的累加单元。

2. map中拷贝累加listMap中各属性的值

(1)map中的keyList分为三类:第一类是忽略的key列表,第二类是拷贝属性的key列表,第三类是除了前两类,数值类型的需要累加的key列表;
(2)对拷贝源的sourceList进行遍历;对每一个拷贝源map,亦进行key的遍历;
(3)进行判断,如果key值在拷贝列表里面,则执行拷贝操作;否则,如果也不在忽略列表里面,则执行累加操作。代码如下所示:

    public static copyAddListMap2Map(Map<String,Object> destMap, List<Map<String, Object>> sourceList, List<String> ignoreList, List<String> copyList) {
        for (Map<String, Object> item : sourceList) {
            for (Map.Entry<String, Object> entry : item.entrySet()) {
                final String key = entry.getKey();
                if (copyList != null && copyList.contains(key)) {
                    destMap.put(key, item.get(key));
                } else if (!(ignoreList != null && ignoreList.contains(key))) {
                    addMapSameKey(destMap, item, key);
                }
            }
        }
    }

(4)适用场景
如果在sql中执行了查询后,需要在java后台附加统计汇总信息,则可以使用该方法,完成listMap的统计汇总。统计后,合并listMap和map即可。

3. listMap树结构累加求和

(1)list是Map的集合;Map中,又包括有children为key的listMap集合;
(2)对list集合进行遍历;对每一个map,判断该map是否存在children的listMap集合;如果存在,则执行map集合对ListMap的属性拷贝和累加。
(3)需要注意的是,忽略列表和属性拷贝列表。代码如下所示:

public static void copyAddListMapChild2Parent(List<Map<String, Object>> list, List<String> ignoreList, List<String> copyList) {
        for (Map<String, Object> item : list) {
            // 如果子节点存在,则对应节点的属性,等于子节点列表对应的属性的和。
            if (item.get("children") != null) {
                List<Map<String, Object>> childList = (List<Map<String, Object>>) item.get("children");

                // 子节点列表属性之和,拷贝到对应的父节点。
                copyAddListMap2Map(item,childList,ignoreList,copyList);
            }
        }
    }

(4)适用场景,java后台中,需要对树形结构进行汇总的情况。

(好记性不如烂笔头。对抗遗忘的最好方式是:在解决问题的时候,记录下遇到的问题和解决的方式,后续遇到相同的问题,只需要翻翻笔记即可。)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

fanjianglin

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值