Java 按日期分组
我有一个csv文件,格式为“日期(LocalDate);小时;值;类型”。我应该对这些数据执行操作,例如查找平均值、计算缺失值(日期间隔的值类型) 我可以在字符串列表中循环时构建每小时观察对象:Java 按日期分组,java,group-by,Java,Group By,我有一个csv文件,格式为“日期(LocalDate);小时;值;类型”。我应该对这些数据执行操作,例如查找平均值、计算缺失值(日期间隔的值类型) 我可以在字符串列表中循环时构建每小时观察对象: new HourlyObs(date,hour,val,type); 这些观察值是每小时一次的(虽然不是每天24个OB,因为有些数据丢失),但我认为,考虑到我应该实现的功能,将它们按日期分组,然后执行一些二进制搜索会更容易 所以我的想法是创建一个对象数组,其中对象的设计如下: class DailyO
new HourlyObs(date,hour,val,type);
这些观察值是每小时一次的(虽然不是每天24个OB,因为有些数据丢失),但我认为,考虑到我应该实现的功能,将它们按日期分组,然后执行一些二进制搜索会更容易
所以我的想法是创建一个对象数组,其中对象的设计如下:
class DailyObservation {
private LocalDate date;
private ArrayList<HourlyObs>;
public float avgVal();
public int missingVals();
public float nrOfType();}
class日常观察{
私有本地日期;
私人ArrayList;
公共浮动平均值();
public int missingVals();
公共浮点nrOfType();}
是否有一种“简单”且高效的算法来创建每日观测数组?我不能把我的头绕在它周围,我不允许使用流进行聚合。
非常感谢您的帮助 数据是否已排序
如果对它进行了排序,那么您可以对其进行迭代,跟踪日期更改并相应地创建新对象
如果数据没有排序,那么最好的办法可能是创建一个地图,其中日期是关键,DailyObservation
是值。对于每个数据条目,您都要检查给定日期的地图中是否已经存在对象
编辑:
对于已排序的数据,您可以尝试以下操作:
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;
}
public List parseObservations(){
列表结果=新建ArrayList();
DailyObservation电流=新的DailyObservation();
字符串[]行;
而((line=readLine())!=null){
字符串日期字符串=行[0];
LocalDate LocalDate=LocalDate.parse(日期字符串);
如果(!localDate.equals(current.getDate())){
当前=新的每日观测();
结果。添加(当前);
}
HourlyObs HourlyObs=新的HourlyObs();
//
//根据需要将数据从lie分配到hourlyObs
//
当前.添加小时数(小时数);
}
返回结果;
}
您可以按如下方式进行设计:
class DailyObservation {
private LocalDate date;
private Map<Integer, HourlyObservation> hourlyObservations = new HashMap<Integer, HourlyObservation>();
public float avgVal();
public int missingVals();
public float nrOfType();
public Map getHourlyObservations(){
return hourlyObservations;
}
//Other setters and getters
}
谢谢,是的,数据已排序。我尝试了迭代,但没有得到预期的结果,因为每个步骤都会创建一个对象。我想我需要在每个不同的日期创建一个,但在将每小时的观察添加到日常对象中时,我没有成功地做到这一点。如果我有一个27k个不同的日期和500k个小时OB的列表,那么用于日期相等性检查的嵌套循环中的操作量将变得巨大。除了暴力,还有其他更有效的方法吗?@J.Dow我已经编辑了我的答案,检查它是否适合你。非常感谢,这正是我想要的。
DailyObservation do = new DailyObservation();
do.getHourlyObservations().put("13", new HourlyObservation(do.getDate(), 13, some value, some type));
do.getHourlyObservations().put("14", new HourlyObservation(do.getDate(), 14, some value, some type));