Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 按日期分组_Java_Group By - Fatal编程技术网

Java 按日期分组

Java 按日期分组,java,group-by,Java,Group By,我有一个csv文件,格式为“日期(LocalDate);小时;值;类型”。我应该对这些数据执行操作,例如查找平均值、计算缺失值(日期间隔的值类型) 我可以在字符串列表中循环时构建每小时观察对象: new HourlyObs(date,hour,val,type); 这些观察值是每小时一次的(虽然不是每天24个OB,因为有些数据丢失),但我认为,考虑到我应该实现的功能,将它们按日期分组,然后执行一些二进制搜索会更容易 所以我的想法是创建一个对象数组,其中对象的设计如下: class DailyO

我有一个csv文件,格式为“日期(LocalDate);小时;值;类型”。我应该对这些数据执行操作,例如查找平均值、计算缺失值(日期间隔的值类型)

我可以在字符串列表中循环时构建每小时观察对象:

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));