表中有姓名,部门序号,部门名称,人员排序,年度,月份,假期种类,请假天数这几个字段 使用stream按部门、年月、人员分组汇总个人总请假天数并按部门序号及人员排序进行排列
时间: 2024-05-12 17:19:09 浏览: 39
假设表格名称为"leave",可以按照以下方式使用stream进行分组和汇总:
```
Map<String, Map<String, Map<String, Integer>>> result = leave.stream()
.collect(Collectors.groupingBy(
l -> l.get("部门序号") + "-" + l.get("部门名称"), // 按部门分组
Collectors.groupingBy(
l -> l.get("年度") + "-" + l.get("月份"), // 按年月分组
Collectors.groupingBy(
l -> l.get("姓名"), // 按人员分组
Collectors.summingInt(l -> Integer.parseInt(l.get("请假天数"))) // 汇总请假天数
)
)
));
// 对结果进行部门序号和人员排序
List<String> sortedKeys = result.keySet().stream()
.sorted(Comparator.comparingInt(k -> Integer.parseInt(k.split("-")[0]))) // 按部门序号排序
.collect(Collectors.toList());
for (String key : sortedKeys) {
System.out.println(key);
Map<String, Map<String, Integer>> departmentLeave = result.get(key);
for (String yearMonth : departmentLeave.keySet()) {
System.out.println("\t" + yearMonth);
Map<String, Integer> personLeave = departmentLeave.get(yearMonth);
personLeave.entrySet().stream()
.sorted(Comparator.comparingInt(e -> Integer.parseInt(e.getKey()))) // 按人员排序
.forEach(e -> System.out.println("\t\t" + e.getKey() + ": " + e.getValue()));
}
}
```
这样可以得到一个嵌套的Map,其中第一层按部门分组,第二层按年月分组,第三层按人员分组,对应的值为个人总请假天数。最后对结果进行部门序号和人员排序输出。
阅读全文