Java如何通过循环按交易日期生成去重的MasterDetail主从列表
逻辑修正方案
原有代码核心问题
- 内层遍历每匹配到一个不同日期就新增一次
MasterDetail对象,同一条输入会被重复添加N次(N等于当前列表长度) - 匹配到同日期时直接覆盖整个
MasterDetail对象,会丢失之前已存入的同日期明细 - 每次新建
MasterDetail时仅传入当前单条明细,没有复用已有同日期对象的明细集合
实现方案
方案1:用Map临时存储(性能更高,推荐)
借助Map的O(1)查找特性,用交易日期作为键快速匹配同日期主对象:
// 临时存储映射:交易日期 -> 对应MasterDetail对象 Map<String, MasterDetail> dateMasterMap = new HashMap<>(); for (Input input : inputList) { String transDate = input.getTransactionDate(); MasterDetail currentMd = dateMasterMap.get(transDate); // 同日期对象不存在则新建 if (currentMd == null) { Master master = new Master(transDate); List<Detail> detailList = new ArrayList<>(); currentMd = new MasterDetail(master, detailList); dateMasterMap.put(transDate, currentMd); } // 明细加入已有集合 currentMd.getDetails().add(new Detail(input.getAmount())); } // 转换为最终结果列表 List<MasterDetail> masterDetails = new ArrayList<>(dateMasterMap.values()); // 若需要按交易日期排序,可补充以下逻辑 masterDetails.sort(Comparator.comparing(md -> md.getMaster().getTransDate()));
方案2:双层循环实现(兼容原有写法)
如果不想引入Map,可修正原有双层循环逻辑:
List<MasterDetail> masterDetails = new ArrayList<>(); for (Input input : inputList) { String transDate = input.getTransactionDate(); boolean dateExisted = false; // 先遍历查找是否有同日期对象 for (MasterDetail md : masterDetails) { if (md.getMaster().getTransDate().equals(transDate)) { // 存在则新增明细 md.getDetails().add(new Detail(input.getAmount())); dateExisted = true; break; } } // 不存在则新建主从对象 if (!dateExisted) { Master master = new Master(transDate); List<Detail> detailList = new ArrayList<>(); detailList.add(new Detail(input.getAmount())); masterDetails.add(new MasterDetail(master, detailList)); } }
注意事项
- 确保
MasterDetail类提供getDetails()公共方法,或者单独封装addDetail(Detail detail)方法用于添加明细 - 交易日期若为字符串类型,需保证格式统一避免匹配失败;若为
Date/LocalDate类型,需保证equals方法逻辑符合预期
内容的提问来源于stack exchange,提问作者Alvin
相关产品推荐
相关产品推荐

