You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于自定义对象列表构建按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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 04:26:01