Java 你如何处理跨越周末和非工作时间的时间序列
我正在开发一个类,该类将包含具有时间戳和多个度量的对象。这些测量通常在每个工作日的08:00到16:00之间进行,但需要灵活。现在,我希望能够指定一个时间间隔,比如说1小时,然后得到平均值。类似于myArrayList.getAvrageHight()的内容,并让它返回上一小时所有测量值的平均高度。我计划只保留列表中需要的条目,并删除那些“超时”的条目 在同一天内做到这一点是非常直接的。但是我想,当我在周二早上8点15分调用这个方法时,myArrayList将包含周一45分钟的数据,以及周二15分钟的数据 我最大的限制之一是测量值以任意间隔出现,从1分钟到每秒多次 到目前为止,每次添加测量值时,我都会计算平均值:Java 你如何处理跨越周末和非工作时间的时间序列,java,arraylist,binary-search,Java,Arraylist,Binary Search,我正在开发一个类,该类将包含具有时间戳和多个度量的对象。这些测量通常在每个工作日的08:00到16:00之间进行,但需要灵活。现在,我希望能够指定一个时间间隔,比如说1小时,然后得到平均值。类似于myArrayList.getAvrageHight()的内容,并让它返回上一小时所有测量值的平均高度。我计划只保留列表中需要的条目,并删除那些“超时”的条目 在同一天内做到这一点是非常直接的。但是我想,当我在周二早上8点15分调用这个方法时,myArrayList将包含周一45分钟的数据,以及周二15
protected void computeAvrages() {
averageWeight = 0;
averageSpeed = 0;
averageHeight = 0;
for (int i = 0; i < super.size(); i++) {
averageWeight += super.get(i).getWeight();
averageSpeed += super.get(i).getSpeed();
averageHeight += super.get(i).getHeight();
}
averageWeight = averageWeight/super.size();
averageSpeed = averageSpeed/super.size();
averageHeight = averageHeight/super.size();
}
myArrayList按时间戳按升序排序(我可以在此列表中使用二进制搜索),我计划保留的记录量将从1.000->500.000,具体取决于交通量(大约一周内每秒3辆车)。时间间隔保留为秒,因此当我指定1小时时,我将其存储为3600
当我调用myArrayList.add(aCar)时,会调用computeAvrages,但我想知道的是:
然后我想计算在我的时间范围内经过的车辆平均1小时。但是在周二08:15,我不想只得到最后15分钟的平均值,我想得到周一最后45分钟的平均值和周二前15分钟的平均值。因此,我上面的问题适用。将总条目数(在时间段内)除以总时间段 举个例子:如果是周二早上8:15。你需要最后15分钟加上前一天的最后45分钟来完成这一小时的平均值。(顺便说一句,这真的很奇怪),然后将前一天最后45分钟的数据与最后15分钟的平均值相加
就数据结构而言,那么您的“实时”平均值将包含一个小时的值。当您的时间段内的一分钟过去时,您将在一侧添加数据,从另一侧删除数据。这将允许您有一个可能跨越两天的小时。将总条目数(在时间段内)除以总时间段 举个例子:如果是周二早上8:15。你需要最后15分钟加上前一天的最后45分钟来完成这一小时的平均值。(顺便说一句,这真的很奇怪),然后将前一天最后45分钟的数据与最后15分钟的平均值相加
就数据结构而言,那么您的“实时”平均值将包含一个小时的值。当您的时间段内的一分钟过去时,您将在一侧添加数据,从另一侧删除数据。这将允许您有一个可能跨越两天的小时。因此,如果我理解正确的话。。。从15:15到16:15,你得到的平均值是:2。从8:15到9:15,你得到的平均值是:3 您希望将时间从16:00计算到16:15,并将其包括在8:15到9:00的平均时间中 这是一道编程题还是一道数学题?因为如果这是一道数学题,你似乎应该用(15/60)*2+(45/60)*3来计算你早上的平均值(从8:00到9:00)
但是,你应该每小时做一次,而不仅仅是每天的几个小时。如果你的样本是从8:30到9:30,从9:30到10:30,你应该把每个样本平均起来。所以,如果我理解正确的话。。。从15:15到16:15,你得到的平均值是:2。从8:15到9:15,你得到的平均值是:3 您希望将时间从16:00计算到16:15,并将其包括在8:15到9:00的平均时间中 这是一道编程题还是一道数学题?因为如果这是一道数学题,你似乎应该用(15/60)*2+(45/60)*3来计算你早上的平均值(从8:00到9:00)
但是,你应该每小时做一次,而不仅仅是每天的几个小时。如果你的样本是从8:30到9:30,从9:30到10:30,你可能应该把每个样本平均起来。你的问题太复杂了,以至于我(和许多其他人)有更多的问题而不是答案。无论如何,这是我的两分钱,看看你问题的最后两段 我将使用以下类:
CarEvent
具有三个属性-重量、高度、速度
EventTimeStamp
具有两个属性-Date,ts
。ts为短型,范围为0800至1600。类应该有两个方法-subtract(int-days,int-hours)
和add(int-days,int-hours)
都返回另一个EventTimeStamp实例TrafficLog
,它保存一个
public class Car {
double weight;
double speed;
double height;
int timeStamp;
public Car(int timeStamp, double weight, double speed, double height) {
this.timeStamp = timeStamp;
this.weight = weight;
this.speed = speed;
this.height = height;
}
public double getWeight() {
return weight;
}
public double getSpeed() {
return speed;
}
public double getHeight() {
return height;
}
public double getTimeStamp() {
return timeStamp;
}
}
public float getAverageTraffic(EventTimeStamp startDate, int durationHours)
{
EventTimeStamp startEventTS = startDate.subtract(0,durationHours);
CarEvent startEvent = eventList.get(startEventTS); //there might not be an event at exactly this point. So some tolerance have to be built in to this.
CarEvent endEvent = eventList.get(startDate);
return getAverage(startEvent,endEvent);//the two params are part of a linked list, so you can iterate and compute the average.
}