Dart如何按date字段比对合并两个对象列表为单个列表
两个异结构列表按date字段合并实现方案
核心实现思路是用哈希表做中间暂存,一次遍历两个列表完成合并,避免低效的双重循环匹配:
- 初始化以
date值为键的哈希映射,作为合并过程的临时存储 - 遍历第一个列表,将每个元素的
date、day_data写入映射,对应条目的night_data初始赋值为null - 遍历第二个列表,判断当前
date是否已在映射中存在:存在则直接补填night_data字段;不存在则新建条目,day_data赋值为null,写入对应date和night_data - 最后将映射中存储的所有值收集为目标类型列表即可,需要排序的话可以在这一步按
date字段排序
可直接参考的Java实现代码
import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; // 实体类定义,实际项目中可结合Lombok简化代码 class Object1 { private String date; private Integer day_data; public Object1(String date, Integer day_data) { this.date = date; this.day_data = day_data; } public String getDate() { return date; } public Integer getDay_data() { return day_data; } } class Object2 { private String date; private Integer night_data; public Object2(String date, Integer night_data) { this.date = date; this.night_data = night_data; } public String getDate() { return date; } public Integer getNight_data() { return night_data; } } class Object3 { private String date; private Integer day_data; private Integer night_data; public Object3() {} public Object3(String date, Integer day_data, Integer night_data) { this.date = date; this.day_data = day_data; this.night_data = night_data; } // getter、setter public String getDate() { return date; } public void setDate(String date) { this.date = date; } public Integer getDay_data() { return day_data; } public void setDay_data(Integer day_data) { this.day_data = day_data; } public Integer getNight_data() { return night_data; } public void setNight_data(Integer night_data) { this.night_data = night_data; } } public class ListMergeTool { public List<Object3> mergeTwoListByDate(List<Object1> list1, List<Object2> list2) { Map<String, Object3> tempMergeMap = new HashMap<>(); // 写入第一个列表的数据 for (Object1 item1 : list1) { Object3 temp = new Object3(); temp.setDate(item1.getDate()); temp.setDay_data(item1.getDay_data()); temp.setNight_data(null); tempMergeMap.put(item1.getDate(), temp); } // 补全第二个列表的数据 for (Object2 item2 : list2) { String currentDate = item2.getDate(); if (tempMergeMap.containsKey(currentDate)) { tempMergeMap.get(currentDate).setNight_data(item2.getNight_data()); } else { Object3 temp = new Object3(); temp.setDate(currentDate); temp.setDay_data(null); temp.setNight_data(item2.getNight_data()); tempMergeMap.put(currentDate, temp); } } // 转成结果列表,需要按date排序可在此处添加排序逻辑 return new ArrayList<>(tempMergeMap.values()); } }
注意事项
- 存储数值的字段请使用包装类型(比如示例中的
Integer),不要用基本类型int,否则无法赋值null - 该实现的时间复杂度为O(m+n),两个列表各遍历一次,数据量较大时性能远优于双重循环匹配的写法
- 如果需要最终结果按
date排序,可以在返回结果前调用Collections.sort()自定义比较规则即可
内容的提问来源于stack exchange,提问作者Shubham Hande
相关产品推荐
相关产品推荐

