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

遍历ArrayList查找缺失的GoldNetValue记录并创建虚拟对象

解决方案:补全GoldNetValue列表的缺失时间记录

这是时间序列数据处理里很常见的需求,我来给你梳理下实现思路和具体代码:

核心思路

要补全10分钟间隔的缺失记录,我们需要按以下步骤操作:

  • 遍历原列表,逐一对比相邻两条记录的时间差
  • 计算两个时间点之间缺失了多少个10分钟间隔
  • 为每个缺失的时间点创建虚拟GoldNetValue对象(价格可以根据需求选择沿用前值、后值或插值,示例里先用前值)
  • 将虚拟对象插入到对应位置,生成完整的时间序列列表

代码实现示例

首先假设你的GoldNetValue类定义如下:

public class GoldNetValue {
    private LocalDateTime date;
    private double goldRate;

    public GoldNetValue(LocalDateTime date, double goldRate) {
        this.date = date;
        this.goldRate = goldRate;
    }

    // Getter和Setter方法
    public LocalDateTime getDate() { return date; }
    public double getGoldRate() { return goldRate; }
    public void setDate(LocalDateTime date) { this.date = date; }
    public void setGoldRate(double goldRate) { this.goldRate = goldRate; }

    @Override
    public String toString() {
        return "GoldNetValue[" + date + " , " + goldRate + "]";
    }
}

接下来是核心处理逻辑的代码:

import java.time.LocalDateTime;
import java.time.temporal.ChronoUnit;
import java.util.ArrayList;
import java.util.List;

public class GoldDataProcessor {
    public static List<GoldNetValue> fillMissingRecords(List<GoldNetValue> originalList) {
        // 边界情况处理:空列表或只有一条记录直接返回
        if (originalList == null || originalList.size() < 2) {
            return originalList;
        }

        List<GoldNetValue> completedList = new ArrayList<>();
        GoldNetValue prevRecord = originalList.get(0);
        completedList.add(prevRecord);

        for (int i = 1; i < originalList.size(); i++) {
            GoldNetValue currentRecord = originalList.get(i);
            LocalDateTime prevTime = prevRecord.getDate();
            LocalDateTime currentTime = currentRecord.getDate();

            // 计算两个时间点的分钟差
            long minutesDiff = ChronoUnit.MINUTES.between(prevTime, currentTime);
            // 计算需要补全的10分钟间隔数量
            int missingCount = (int) (minutesDiff / 10) - 1;

            if (missingCount > 0) {
                // 逐个创建缺失的虚拟记录,这里使用前一个记录的价格
                for (int j = 1; j <= missingCount; j++) {
                    LocalDateTime missingTime = prevTime.plusMinutes(j * 10);
                    GoldNetValue dummyRecord = new GoldNetValue(missingTime, prevRecord.getGoldRate());
                    completedList.add(dummyRecord);
                }
            }

            // 添加当前记录到完整列表
            completedList.add(currentRecord);
            prevRecord = currentRecord;
        }

        return completedList;
    }

    public static void main(String[] args) {
        // 示例数据初始化
        List<GoldNetValue> originalList = new ArrayList<>();
        originalList.add(new GoldNetValue(LocalDateTime.of(2018,3,2,13,20), 87));
        originalList.add(new GoldNetValue(LocalDateTime.of(2018,3,2,13,30), 86.4));
        originalList.add(new GoldNetValue(LocalDateTime.of(2018,3,2,13,40), 85.6));
        originalList.add(new GoldNetValue(LocalDateTime.of(2018,3,2,13,50), 85.8));
        originalList.add(new GoldNetValue(LocalDateTime.of(2018,3,2,14,10), 86.1));
        originalList.add(new GoldNetValue(LocalDateTime.of(2018,3,2,14,30), 86.8));

        // 补全缺失记录
        List<GoldNetValue> completedList = fillMissingRecords(originalList);
        
        // 输出结果
        for (GoldNetValue record : completedList) {
            System.out.println(record);
        }
    }
}

关键细节说明

  • 时间差计算:用ChronoUnit.MINUTES.between来精准计算时间差,避免手动处理日期时间的复杂逻辑
  • 虚拟记录价格:示例中使用前一条记录的价格作为虚拟值,你可以根据业务需求改成后值、前后平均值,或者其他插值算法
  • 列表处理:创建新列表存储补全后的记录,避免修改原列表引发的并发问题
  • 边界处理:提前判断空列表或单条记录的情况,避免报错

运行示例代码后,输出会包含缺失的14:00和14:20两个时间点的虚拟记录:

GoldNetValue[2018-03-02T13:20 , 87.0]
GoldNetValue[2018-03-02T13:30 , 86.4]
GoldNetValue[2018-03-02T13:40 , 85.6]
GoldNetValue[2018-03-02T13:50 , 85.8]
GoldNetValue[2018-03-02T14:00 , 85.8]
GoldNetValue[2018-03-02T14:10 , 86.1]
GoldNetValue[2018-03-02T14:20 , 86.1]
GoldNetValue[2018-03-02T14:30 , 86.8]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 11:14:17