动态获取map集合的每一项之和,算出合计的map加入集合,兼容字符串"-"、double类型和int类型

    /**
     * 动态获取map集合的每一项之和,算出合计的map加入集合,兼容字符串"-"、double类型和int类型
     * @param mapList
     */
    private void getDynamicItemSum(List<Map<String,Object>> mapList){
        // 创建总和Map
        Map<String, Object> mapTotal = new HashMap<>();
        mapTotal.put("NAME", "合计");

        // 自动获取第一个map的字段作为求和字段(排除"NAME")
        Map<String, Object> map1 = mapList.get(0);
        List<String> sumFields = new ArrayList<>(map1.keySet());
        sumFields.remove("NAME");

        // 初始化求和变量和类型标记
        Map<String, Double> sums = new HashMap<>();
        Map<String, Boolean> isDoubleType = new HashMap<>();
        Map<String, Boolean> hasString = new HashMap<>(); // 新增:标记字段是否包含字符串
        for (String field : sumFields) {
            sums.put(field, 0.0);
            isDoubleType.put(field, false);
            hasString.put(field, false); // 初始化为false
        }

        // 遍历mapList进行动态类型判断和求和
        for (Map<String, Object> map : mapList) {
            for (String field : sumFields) {
                Object value = map.get(field);
                if (value instanceof String) {
                    hasString.put(field, true); // 标记该字段包含字符串
                } else if (value instanceof Number) {
                    // 仅当没有字符串时才累加
                    if (!hasString.get(field)) {
                        if (value instanceof Double) {
                            isDoubleType.put(field, true);
                            sums.put(field, sums.get(field) + ((Double) value));
                        } else {
                            sums.put(field, sums.get(field) + ((Number) value).doubleValue());
                        }
                    }
                }
            }
        }

        // 将求和结果放入mapTotal(智能格式化)
        for (String field : sumFields) {
            if (hasString.get(field)) {
                mapTotal.put(field, "-"); // 存在字符串则显示"-"
            } else {
                if (isDoubleType.get(field)) {
                    // Double类型保留两位小数
                    double total = NumberUtil.round(sums.get(field), 2).doubleValue();
                    mapTotal.put(field, total);
                } else {
                    // Int类型直接取整
                    long total = Math.round(sums.get(field));
                    mapTotal.put(field, total);
                }
            }
        }


        // 按照map1的顺序重新排列mapTotal
        Map<String, Object> sortedMap = mapTotal.entrySet().stream()
                .sorted(Comparator.comparingInt(e -> new ArrayList<>(map1.keySet()).indexOf(e.getKey())))
                .collect(Collectors.toMap(
                        Map.Entry::getKey,
                        Map.Entry::getValue,
                        (oldVal, newVal) -> oldVal,
                        LinkedHashMap::new
        ));

        // 将mapTotal插入到mapList的最前面
        mapList.add(0, sortedMap);
    }

 

posted on 2025-08-12 21:02  五官一体即忢  阅读(6)  评论(0)    收藏  举报

导航