我正在开发一个类,该类将包含带有时间戳和多个测量值的对象。这些测量通常在每个工作日的 08:00 到 16:00 之间进行,但需要灵活调整。现在,我想要的是能够指定一个时间间隔,比方说 1 小时,然后得到平均值。像 myArrayList.getAvrageHeight() 这样的东西,并让它返回过去一小时所有测量值的平均高度。我计划只在我的列表中保留需要的条目,并删除那些“超时”的条目。
在同一天内完成此操作非常简单。但我想,当我在星期二早上 8 点 15 分调用此方法时,myArrayList 将包含星期一的 45 分钟数据和星期二的 15 分钟数据。
我最大的限制之一是测量以任意间隔进行,从 1 分钟到每秒多次。
到目前为止,每次添加测量值时我都会计算平均值:
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();
}
我的对象,看起来像这样:
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;
}
}
myArrayList 按时间戳按升序排序(我可以在此列表上使用二进制搜索),我计划保留的记录数量将从 1.000 -> 500.000 取决于流量(大约每秒 3 辆汽车) week) 时间间隔保持为秒,所以当我指定 1 小时时,我将其存储为 3600。
当我调用 myArrayList.add(aCar) 时,会调用 computeAvrages,但我想知道的是:
- 周一→周二,周五→周一的变化应该怎么处理?
- 为简单起见,我目前将开始和停止时间存储为 startHour、startMinute、stopHour 和 stopMinute,您将如何存储这些时间引用?
这个问题对于 stackoverflows 的问题->答案类型来说可能太复杂了,但我会尽量让它更简单:
您正在看高速公路。汽车经过。每辆经过的汽车都会记录重量、高度和速度。现在,我希望能够指定我感兴趣的时间(即 08:00 至 16:00)。只有在工作周期间经过的汽车才有趣(又名星期一 -> 星期五)我只会存储在此期间经过的汽车,但我仍然会收到有关在此时间范围之外经过的汽车的通知。
然后我想计算在我的时间范围内经过的汽车的 1 小时平均值。但是在星期二的 08:15,我对只获得最后 15 分钟的平均值不感兴趣,但我想要星期一最后 45 分钟的平均值加上星期二的前 15 分钟。所以我上面的问题适用。
最佳答案
你的问题太复杂了,我(和许多其他人)有更多的问题而不是答案。无论如何,这是我对你问题的最后两段的两分钱。
我会使用以下类:
- 类
CarEvent
具有三个属性 -wight、height、speed
- class
EventTimeStamp
有两个属性 -Date, ts
。 ts 的类型为 short,范围为 0800 到 1600。该类应该有两个方法 -subtract(int days, int hours)
和add(int days,int hours)
两者返回 EventTimeStamp 的另一个实例。 TrafficLog
类将所有 CarEvent 保存在LinkedListMap
中。 LinkedListMap 是也允许顺序访问的 Map,因此您可以进行二进制搜索。 map 的关键应该是 EventTimeStamp 的一个实例
使用此数据结构,您可以在 TrafficLog 类上实现所需的分析方法。例如,获取平均值:
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.
}
关于java - 你如何处理跨越周末和非工作时间的时间序列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6127162/