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

Java 你如何处理跨越周末和非工作时间的时间序列,java,arraylist,binary-search,Java,Arraylist,Binary Search,我正在开发一个类,该类将包含具有时间戳和多个度量的对象。这些测量通常在每个工作日的08:00到16:00之间进行,但需要灵活。现在,我希望能够指定一个时间间隔,比如说1小时,然后得到平均值。类似于myArrayList.getAvrageHight()的内容,并让它返回上一小时所有测量值的平均高度。我计划只保留列表中需要的条目,并删除那些“超时”的条目 在同一天内做到这一点是非常直接的。但是我想,当我在周二早上8点15分调用这个方法时,myArrayList将包含周一45分钟的数据,以及周二15

我正在开发一个类,该类将包含具有时间戳和多个度量的对象。这些测量通常在每个工作日的08:00到16:00之间进行,但需要灵活。现在,我希望能够指定一个时间间隔,比如说1小时,然后得到平均值。类似于myArrayList.getAvrageHight()的内容,并让它返回上一小时所有测量值的平均高度。我计划只保留列表中需要的条目,并删除那些“超时”的条目

在同一天内做到这一点是非常直接的。但是我想,当我在周二早上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();

}
myArrayList按时间戳按升序排序(我可以在此列表中使用二进制搜索),我计划保留的记录量将从1.000->500.000,具体取决于交通量(大约一周内每秒3辆车)。时间间隔保留为秒,因此当我指定1小时时,我将其存储为3600

当我调用myArrayList.add(aCar)时,会调用computeAvrages,但我想知道的是:

  • 我应该如何处理星期一->星期二以及从星期五到星期一的变化
  • 我目前将开始和停止时间存储为startHour、startMinute、stopHour和stopMinute,为了简单起见,您将如何存储这些时间参考
  • 对于stackoverflows问题->答案类型,此问题可能会非常复杂,但我会尝试将其简化:

    你在看高速公路。汽车经过。每辆经过的汽车都会记录重量、高度和速度。现在,我希望能够指定一天中我感兴趣的时间(即08:00到16:00)。只有在工作周路过的车才有意思(也就是周一->周五),我只会在这段时间内储存路过的车,但我仍然会收到关于在这段时间之外路过的车的通知


    然后我想计算在我的时间范围内经过的车辆平均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.
    }