Java中基于ID高效合并多个数据集并累加字段值的完整教程-java教程

本文介绍一种内存友好、时间复杂度为o(n)的java方案,使用hashmap按id索引并聚合多个sheet中的data对象,自动汇总amount1/amount2/amount3字段,确保所有id不丢失。

在实际业务场景(如Excel多表合并、报表聚合、ETL预处理)中,我们常需将多个来源的结构化数据(如不同Sheet)按唯一标识(如id)进行横向合并,并对数值字段做累加(sum)。若采用嵌套循环逐个查找匹配ID,时间复杂度将升至O(n²),且易遗漏或重复。更优解是利用哈希表实现单次遍历聚合——即以id为键构建累加缓存,边读边合并。

以下为推荐实现(已适配Lombok注解,兼容@Data和构造器):

import java.util.*;

public class DataMerger {

    public static List mergeSheetsBySum(Map<String, List> sheetMap) {
        // 使用 ID 作为 key,避免重复创建对象;value 存储当前累计的 Data 实例
        Map accumulator = new HashMap();

        // 遍历每个 Sheet(如 "sheet1", "sheet2", "sheet3")
        for (List dataList : sheetMap.values()) {
            for (Data data : dataList) {
                int id = data.getId();

                if (accumulator.containsKey(id)) {
                    // 已存在:累加各 amount 字段
                    Data existing = accumulator.get(id);
                    existing.setAmount1(existing.getAmount1() + data.getAmount1());
                    existing.setAmount2(existing.getAmount2() + data.getAmount2());
                    existing.setAmount3(existing.getAmount3() + data.getAmount3());
                } else {
                    // 首次出现:深拷贝(避免引用原对象导致副作用)
                    accumulator.put(id, Data.builder()
                            .id(data.getId())
                            .amount1(data.getAmount1())
                            .amount2(data.getAmount2())
                            .amount3(data.getAmount3())
                            .build());
                }
            }
        }

        // 转为 List 并返回(顺序不保证,如需有序可转为 TreeMap 或后续排序)
        return new ArrayList(accumulator.values());
    }
}

✅ 关键优化点说明:

  • 时间效率:仅需一次全量遍历(O(N),N为所有Sheet中Data总数),远优于暴力搜索的O(N×M);
  • 内存安全:使用builder()或显式构造新实例,避免修改原始Data对象(尤其当原始列表被复用时);
  • ID完整性:HashMap天然去重+覆盖逻辑,确保任意Sheet中出现的ID均被保留,无遗漏;
  • 扩展友好:若后续增加amount4等字段,只需在累加块中补充一行,无需重构主干逻辑。

⚠️ 注意事项:

夏夕资源网专注于CMS网站模板,主流语言整站网站源码下载,网站建设相关教程分享,好用的软件素材整合下载,提供一站式便捷自助服务。
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!
7. 如遇到加密压缩包,默认解压密码为"zy.lucklyus.top",如遇到无法解压的请联系管理员!
夏夕资源网-网站模板_免费源码_资源素材 » Java中基于ID高效合并多个数据集并累加字段值的完整教程-java教程
在线时间:12:00 - 22:00
关注微信公众号:微信公众号
站长邮箱:[email protected]
  • 运营天数: 1393+
  • 资源总数: 47989+
  • 用户总数: 1+
  • 今日更新: 0+
  • 访问次数: 4024504+
  • 本周更新: 0+
  • 最后更新: 2026-03-16

本站指数

×
  • 运营天数: 1393+
  • 资源总数: 47989+
  • 用户总数: 1+
  • 今日更新: 0+
  • 访问次数: 4024504+
  • 本周更新: 0+
  • 最后更新: 2026-03-16