java - 你如何处理跨越周末和非工作时间的时间序列

标签 java arraylist binary-search

我正在开发一个类,该类将包含带有时间戳和多个测量值的对象。这些测量通常在每个工作日的 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,但我想知道的是:

  1. 周一→周二,周五→周一的变化应该怎么处理?
  2. 为简单起见,我目前将开始和停止时间存储为 startHour、startMinute、stopHour 和 stopMinute,您将如何存储这些时间引用?

这个问题对于 stackoverflows 的问题->答案类型来说可能太复杂了,但我会尽量让它更简单:

您正在看高速公路。汽车经过。每辆经过的汽车都会记录重量、高度和速度。现在,我希望能够指定我感兴趣的时间(即 08:00 至 16:00)。只有在工作周期间经过的汽车才有趣(又名星期一 -> 星期五)我只会存储在此期间经过的汽车,但我仍然会收到有关在此时间范围之外经过的汽车的通知。

然后我想计算在我的时间范围内经过的汽车的 1 小时平均值。但是在星期二的 08:15,我对只获得最后 15 分钟的平均值不感兴趣,但我想要星期一最后 45 分钟的平均值加上星期二的前 15 分钟。所以我上面的问题适用。

最佳答案

你的问题太复杂了,我(和许多其他人)有更多的问题而不是答案。无论如何,这是我对你问题的最后两段的两分钱。

我会使用以下类:

  1. CarEvent 具有三个属性 - wight、height、speed
  2. class EventTimeStamp 有两个属性 - Date, ts。 ts 的类型为 short,范围为 0800 到 1600。该类应该有两个方法 - subtract(int days, int hours)add(int days,int hours) 两者返回 EventTimeStamp 的另一个实例。
  3. 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/

相关文章:

java - 如何使接口(interface)中的返回类型通用?

java - JPA:使用字符串字段,但修改它们并保存为字节数组

java - 如何从数组中查找项目并将其添加到列表中 (Java)

Java Arraylist清除: how clear() works

python - 如何计算排序列表中两个值之间的元素?

c# - 日期 <= n 的最大日期的二进制搜索日期列表

java - 如何从类型为 java.util.Date 的 JavaScript 对象返回?

java - Hibernate PostInsertEventListener.requiresPostCommitHanding 是做什么的?

java - 迭代 HashMap 的 ArrayList 很困难

c++ - 二分查找函数的问题