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

Java实现最早与最晚数据集合并并生成新JSON对象咨询

按ID合并最早/最晚数据集生成指定JSON结构

我有两个查询分别返回最早和最晚数据集的相同结构对象,示例数据集如下:

List<Map<String, Object>> earliestDataset = Arrays.asList(
    Map.of("id", 123, "highlights", 2, "created_date", "2024-01-01", "saves", 5, "wins", 3),
    Map.of("id", 124, "highlights", 3, "created_date", "2024-01-03", "saves", 2, "wins", 1),
    Map.of("id", 253, "highlights", 5, "created_date", "2024-02-02", "saves", 3, "wins", 7)
);

List<Map<String, Object>> latestDataset = Arrays.asList(
    Map.of("id", 123, "highlights", 6, "created_date", "2024-04-01", "saves", 22, "wins", 14),
    Map.of("id", 124, "highlights", 9, "created_date", "2024-04-03", "saves", 8, "wins", 9),
    Map.of("id", 253, "highlights", 12, "created_date", "2024-03-02", "saves", 15, "wins", 20)
);

希望将两个数据集按id合并,生成如下格式的新JSON对象(以ID=123为例):

{
  "id": "123",
  "highlights": [
    {
      "earliest": "2",
      "latest": "6",
      "difference": "+4"
    }
  ],
  "created_date": [
    {
      "earliest": "2024-01-01",
      "latest": "2024-04-01"
    }
  ],
  "saves": [
    {
      "earliest": "5",
      "latest": "22",
      "difference": "+17"
    }
  ],
  "wins": [
    {
      "earliest": "3",
      "latest": "14",
      "difference": "+11"
    }
  ]
}

不确定应使用Map还是Stream来匹配id并映射值生成新JSON对象,恳请技术帮助。


解决方案:结合Map索引与Stream处理

1. 用Map构建最晚数据集的ID索引

先把latestDataset转换成以ID为键的Map,实现O(1)时间复杂度的快速查找,避免嵌套循环提升效率:

Map<Integer, Map<String, Object>> latestById = latestDataset.stream()
    .collect(Collectors.toMap(
        item -> (Integer) item.get("id"),
        item -> item
    ));

2. 遍历最早数据集,合并生成目标结构

通过Stream遍历最早数据集的每个对象,匹配对应ID的最新数据,按要求构建字段结构:

List<Map<String, Object>> mergedResult = earliestDataset.stream()
    .map(earliestItem -> {
        Integer id = (Integer) earliestItem.get("id");
        Map<String, Object> latestItem = latestById.get(id);
        
        if (latestItem == null) {
            return null; // 无对应最新数据则跳过
        }
        
        Map<String, Object> merged = new HashMap<>();
        merged.put("id", String.valueOf(id));
        
        // 处理需计算差值的字段:highlights、saves、wins
        List<String> diffFields = Arrays.asList("highlights", "saves", "wins");
        diffFields.forEach(field -> {
            Integer earliestVal = (Integer) earliestItem.get(field);
            Integer latestVal = (Integer) latestItem.get(field);
            int diff = latestVal - earliestVal;
            
            Map<String, String> fieldMap = new HashMap<>();
            fieldMap.put("earliest", String.valueOf(earliestVal));
            fieldMap.put("latest", String.valueOf(latestVal));
            fieldMap.put("difference", diff >= 0 ? "+" + diff : String.valueOf(diff));
            
            merged.put(field, Collections.singletonList(fieldMap));
        });
        
        // 处理无需差值的字段:created_date
        Map<String, String> dateMap = new HashMap<>();
        dateMap.put("earliest", (String) earliestItem.get("created_date"));
        dateMap.put("latest", (String) latestItem.get("created_date"));
        merged.put("created_date", Collections.singletonList(dateMap));
        
        return merged;
    })
    .filter(Objects::nonNull) // 过滤无对应最新数据的项
    .collect(Collectors.toList());

3. 转换为JSON字符串(可选)

若需输出格式化的JSON,可使用Jackson库:

ObjectMapper objectMapper = new ObjectMapper();
objectMapper.enable(SerializationFeature.INDENT_OUTPUT);
String jsonOutput = objectMapper.writeValueAsString(mergedResult);
System.out.println(jsonOutput);

方案说明

  • Map的作用:构建ID到最新数据的索引,解决嵌套循环查找效率低的问题。
  • Stream的作用:用函数式编程简化遍历、转换、过滤等操作,代码更简洁易维护。
  • 这种结合方式同时兼顾了查找效率和代码可读性,是处理此类数据集合并需求的最优实践之一。

内容的提问来源于stack exchange,提问作者annaM

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 04:20:19