乐趣区

Map实现分组

利用 Map 对数据进行分组,对数字类型字段求平均值,或者求和。

import java.util.ArrayList;
import java.util.Arrays;
import java.util.DoubleSummaryStatistics;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;

public class MapGroupViaLam {public static void main(String[] args) {List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
        putValInto(list);
        List<String> groupKeys = new ArrayList<>(Arrays.asList(new String[] {"PROVICE", "CITY"}));
        String groupNameStr = reBuildGroupMap(list, groupKeys);
        
        System.out.println("-------- 分组前 -------------");
        list.forEach(x -> {System.out.println(x);
        });
        
        List<Map<String, Object>> result = new ArrayList<>();
        Map<String, List<Map<String, Object>>> glist = list.stream()
                .collect(Collectors.groupingBy(e -> e.get(groupNameStr).toString()));

        glist.forEach((k, slist) -> {Map<String, Object> nmap = new HashMap<>();
            DoubleSummaryStatistics sumcc = slist.stream()
                    .collect(Collectors.summarizingDouble(e -> Double.valueOf(e.get("NUM1").toString())));
            DoubleSummaryStatistics sumcc2 = slist.stream()
                    .collect(Collectors.summarizingDouble(e -> Double.valueOf(e.get("NUM2").toString())));
            nmap.put("PROVICE", slist.get(0).get("PROVICE"));
            nmap.put("CITY", slist.get(0).get("CITY"));
            nmap.put("NUM1", sumcc.getSum());// 求和
            nmap.put("NUM2", sumcc2.getAverage());// 求和
            result.add(nmap);

        });
        System.out.println("-------- 分组后 -------------");
        result.forEach(x -> {System.out.println(x);
        });

    }

    /**
     * 重建需要 group by 的 map 添加一列数据保存所有 groupby 拼接字段
     * 
     * @param excelDatas
     * @param groupKeys
     */
    private static String reBuildGroupMap(List<Map<String, Object>> excelDatas, List<String> groupKeys) {
        String groupStr = "";
        if (excelDatas != null && !excelDatas.isEmpty() && groupKeys != null && !groupKeys.isEmpty()) {StringBuffer newKey = new StringBuffer();
            StringBuffer newVal = new StringBuffer();
            for (int i = 0, excelDataSize = excelDatas.size(); i < excelDataSize; i++) {Map<String, Object> excelData = excelDatas.get(i);
                Set<Map.Entry<String, Object>> eSets = excelData.entrySet();
                for (Map.Entry<String, Object> entry : eSets) {String key = entry.getKey();
                    String val = entry.getValue() == null ? "" : entry.getValue().toString();
                    if (groupKeys.contains(key)) {newKey.append(key);
                        newVal.append(val);
                    }
                }
                if (newKey.length() > 0 && newVal.length() > 0) {if (i==0) {groupStr = newKey.toString();    
                    }
                    excelData.put(newKey.toString(), newVal.toString());
                }
                newKey.setLength(0);
                newVal.setLength(0);
            }
        }
        return groupStr;
    }

    private static void putValInto(List<Map<String, Object>> excelDatas) {Map<String, Object> excelMap1 = new HashMap<String, Object>();
        excelMap1.put("PROVICE", "四川省");
        excelMap1.put("CITY", "成都市");
        excelMap1.put("NUM1", "100");
        excelMap1.put("NUM2", "100");
        excelDatas.add(excelMap1);

        Map<String, Object> excelMap2 = new HashMap<String, Object>();
        excelMap2.put("PROVICE", "四川省");
        excelMap2.put("CITY", "南充市");
        excelMap2.put("NUM1", "200");
        excelMap2.put("NUM2", "200");
        excelDatas.add(excelMap2);

        Map<String, Object> excelMap3 = new HashMap<String, Object>();
        excelMap3.put("PROVICE", "四川省");
        excelMap3.put("CITY", "南充市");
        excelMap3.put("NUM1", "300");
        excelMap3.put("NUM2", "300");
        excelDatas.add(excelMap3);

        Map<String, Object> excelMap4 = new HashMap<String, Object>();
        excelMap4.put("PROVICE", "河南省");
        excelMap4.put("CITY", "郑州市");
        excelMap4.put("NUM1", "400");
        excelMap4.put("NUM2", "400");
        excelDatas.add(excelMap4);

        Map<String, Object> excelMap5 = new HashMap<String, Object>();
        excelMap5.put("PROVICE", "河南省");
        excelMap5.put("CITY", "郑州市");
        excelMap5.put("NUM1", "500");
        excelMap5.put("NUM2", "500");
        excelDatas.add(excelMap5);

        Map<String, Object> excelMap6 = new HashMap<String, Object>();
        excelMap6.put("PROVICE", "河南省");
        excelMap6.put("CITY", "南阳市");
        excelMap6.put("NUM1", "600");
        excelMap6.put("NUM2", "600");
        excelDatas.add(excelMap6);
    }

}
退出移动版