如何基于自定义对象列表构建按startTime、groupName分组的双层HashMap?
实现按月份+分组名的嵌套HashMap分组
核心思路
先以startTime(月份)为外层HashMap的键,每个月份对应一个内层HashMap;内层HashMap再以groupName为键,对应存储该分组下的Assignmentsdata列表。
方式一:传统循环实现(兼容Java 8之前版本)
// 定义嵌套HashMap结构 Map<String, Map<String, List<Assignmentsdata>>> nestedMap = new HashMap<>(); for (Assignmentsdata data : list) { String month = data.startTime; // 假设startTime已为月份格式,如"2024-09";若为完整时间需额外处理 String groupName = data.groupName; // 1. 获取当前月份对应的内层Map,不存在则创建新的HashMap Map<String, List<Assignmentsdata>> groupMap = nestedMap.getOrDefault(month, new HashMap<>()); // 2. 获取当前分组对应的列表,不存在则创建新的ArrayList List<Assignmentsdata> dataList = groupMap.getOrDefault(groupName, new ArrayList<>()); // 3. 将当前数据添加到列表 dataList.add(data); // 4. 更新内层Map和外层Map groupMap.put(groupName, dataList); nestedMap.put(month, groupMap); }
方式二:使用computeIfAbsent简化循环
利用Java 8新增的computeIfAbsent方法,省去空值判断,代码更简洁:
Map<String, Map<String, List<Assignmentsdata>>> nestedMap = new HashMap<>(); for (Assignmentsdata data : list) { String month = data.startTime; String groupName = data.groupName; // 链式操作:外层不存在月份则创建内层Map,内层不存在分组则创建列表,最后添加数据 nestedMap.computeIfAbsent(month, k -> new HashMap<>()) .computeIfAbsent(groupName, k -> new ArrayList<>()) .add(data); }
方式三:Java 8+ Stream API实现(最优雅)
通过Stream的groupingBy嵌套分组,一行代码完成需求:
Map<String, Map<String, List<Assignmentsdata>>> nestedMap = list.stream() .collect(Collectors.groupingBy( Assignmentsdata::getStartTime, // 第一级分组:按月份 Collectors.groupingBy(Assignmentsdata::getGroupName) // 第二级分组:按分组名 ));
注意:如果
Assignmentsdata的字段是私有访问权限,需要先添加对应的getter方法(getStartTime()、getGroupName())。
额外说明:处理非月份格式的startTime
如果startTime是完整时间字符串(如"2024-09-15 14:30"),需要先解析为月份格式,示例代码:
// 使用Java 8+ DateTimeFormatter解析时间 DateTimeFormatter inputFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm"); DateTimeFormatter monthFormatter = DateTimeFormatter.ofPattern("yyyy-MM"); for (Assignmentsdata data : list) { LocalDateTime dateTime = LocalDateTime.parse(data.startTime, inputFormatter); String month = dateTime.format(monthFormatter); String groupName = data.groupName; nestedMap.computeIfAbsent(month, k -> new HashMap<>()) .computeIfAbsent(groupName, k -> new ArrayList<>()) .add(data); }
内容的提问来源于stack exchange,提问作者irfan yaqub
相关产品推荐
相关产品推荐

