遍历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
相关产品推荐
相关产品推荐

