我有一个 csv 文件,其中包含大约 500k 的观测值,格式为“日期(LocalDate);小时;值;类型”。我应该对这些数据执行操作,例如查找平均值、计算缺失值以及日期间隔的值类型。
我可以在循环字符串列表时构造每小时观察对象:
new HourlyObs(date,hour,val,type);
这些观察结果是每小时一次(虽然不是每天 24 个观测值,因为缺少一些数据),但我认为考虑到我应该实现的功能,按日期对它们进行分组然后执行一些二进制搜索会更容易。
所以我的想法是创建一个对象数组,其中对象的设计如下:
class DailyObservation {
private LocalDate date;
private ArrayList<HourlyObs>;
public float avgVal();
public int missingVals();
public float nrOfType();}
是否有一种“简单”且有效的算法来创建这组日常观察数据?我无法理解它,也不允许使用流进行聚合。 非常感谢您的帮助。
最佳答案
数据排序了吗?
如果它已排序,那么您可以对其进行迭代,跟踪日期更改并相应地创建新对象。
如果数据未排序,那么最好的想法可能是创建一个 map ,其中日期是键,DailyObservation
是值。对于每个数据条目,您检查给定日期的 map 中是否已存在对象。
编辑:
对于排序的数据,您可以尝试这样的操作:
public List<DailyObservation> parseObservations(){
List<DailyObservation> results = new ArrayList<>();
DailyObservation current = new DailyObservation();
String[] line;
while((line=readLine()) != null){
String dateString = line[0];
LocalDate localDate = LocalDate.parse(dateString);
if (!localDate.equals(current.getDate())){
current = new DailyObservation();
results.add(current);
}
HourlyObs hourlyObs = new HourlyObs();
//
// assign data from lie to the hourlyObs however you want
//
current.addHourlyObs(hourlyObs);
}
return results;
}
关于java - java 按日期分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60490947/