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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 11:18:08