如何在Java中列出非连续日期数组中缺少的日期?

如何在Java中列出非连续日期数组中缺少的日期?,java,datetime,Java,Datetime,我有一个按日期排序的数据表,用户可以通过提供开始日期和结束日期从中选择一组数据。数据本身是非连续的,因为我没有周末和公共假日的数据 我希望能够在提取的数据集中列出我没有数据的所有日子。在Java中,是否有一种简单的方法: 这是一个有序的日期数组 这是选定的开始日期。(数组中的第一个日期并不总是开始日期) 这是所选的结束日期。(数组中的最后一个日期并不总是结束日期) 返回没有数据的日期列表 您应该能够创建一个过滤迭代器来提供这一点。也许可以让迭代器的方法接受子集合的开始和停止日期。至于迭代器的实际

我有一个按日期排序的数据表,用户可以通过提供开始日期和结束日期从中选择一组数据。数据本身是非连续的,因为我没有周末和公共假日的数据

我希望能够在提取的数据集中列出我没有数据的所有日子。在Java中,是否有一种简单的方法:

  • 这是一个有序的日期数组
  • 这是选定的开始日期。(数组中的第一个日期并不总是开始日期)
  • 这是所选的结束日期。(数组中的最后一个日期并不总是结束日期)
  • 返回没有数据的日期列表

  • 您应该能够创建一个过滤迭代器来提供这一点。也许可以让迭代器的方法接受子集合的开始和停止日期。至于迭代器的实际实现,我想不出比在找到start元素后在整个集合中运行蛮力更优雅的了。

    您可以创建一个临时列表,并根据需要对其执行x操作

    (不是真正的Java。对不起,我对它的记忆很糟糕。)

    dates=[…];//列出你现在拥有的;
    //构建列表
    未使用=[];
    对于(日期i=开始日期;i<结束日期;i+=天){
    未使用。推(i);
    }
    //删除使用过的日期
    对于(int j=0;j-1{//time=00:00:00
    未使用。删除(未使用。索引of((日期)日期[j]);
    }
    }
    
    您可以创建一个开始日期和结束日期之间所有可能日期的列表,然后删除给定数据列表中出现的日期(当大多数日期缺失时效果最佳),或者从空日期列表开始,添加给定数据中未出现的日期

    无论哪种方式,您基本上都会在开始日期和结束日期之间的日期范围内进行迭代,跟踪您在给定日期列表中的位置。您可以将其视为一种“类似合并”的操作,在该操作中,您并行地遍历两个列表,处理出现在一个列表中而不出现在另一个列表中的记录。在伪代码中,空列表版本可能是:

    # given   - array of given dates
    # N       - number of dates in given array
    # missing - array of dates missing
    
    i = 0;    # Index into given date array
    j = 0;    # Index into missing data array
    for (current_date = start_date; current_date <= end_date; current_date++)
    {
        while (given[i] < current_date && i < N)
            i++
        if (i >= N)
            break
        if (given[i] != current_date)
            missing[j++] = current_date
    }
    while (current_date < end_date)
    {
        missing[j++] = current_date
        current_date++
    }
    
    #给定-给定日期的数组
    #N-给定数组中的日期数
    #缺少-缺少日期数组
    i=0;#索引到给定的日期数组中
    j=0;#索引到缺少的数据数组中
    对于(当前日期=开始日期;当前日期=N)
    打破
    如果(给定[i]!=当前日期)
    缺少[j++]=当前_日期
    }
    while(当前日期<结束日期)
    {
    缺少[j++]=当前_日期
    当前日期++
    }
    

    我假设日期类型是以一天为单位量化的;也就是说,
    date+1
    (或
    date++
    )是
    date

    之后的第二天,而其他已经给出的答案看起来相当简单和有趣,并且有一些好的想法(我特别同意Nerdfest的迭代器建议),我想我应该尝试一下,编写一个解决方案来展示我如何在第一次迭代中做到这一点,我相信下面的内容还有改进的余地

    我也可能把你的需求理解得有点过于字面,但你知道如何根据自己的喜好调整代码。哦,很抱歉给这些东西起了可怕的名字。另外,由于此示例使用Calendar,请记住Calendar.roll()在某些情况下可能不会更新整个Calendar对象,因此这是一个潜在的错误

    protected List<Calendar> getDatesWithNoData(Calendar start, Calendar end,
            Calendar[] existingDates) throws ParseException {
    
        List<Calendar> missingData = new ArrayList<Calendar>();
    
        for(Calendar c=start ; c.compareTo(end)<=0 ; c.roll(Calendar.DAY_OF_MONTH, true) ) {
    
            if(!isInDataSet(c, existingDates)) {
                Calendar c2 = Calendar.getInstance();
                c2.setTimeInMillis(c.getTimeInMillis());
    
                missingData.add(c2);
            }
        }
        return missingData;
    }
    
    protected boolean isInDataSet(Calendar toSearch, Calendar[] dataSet) {
        for(Calendar l : dataSet) {
            if(toSearch.equals(l)) return true;
        }
        return false;
    }
    
    受保护列表GetDateSwithNodeData(日历开始、日历结束、,
    日历[]existingDates)引发异常{
    List missingData=new ArrayList();
    对于(日历c=开始;c.比较到(结束)
    
    protected List<Calendar> getDatesWithNoData(Calendar start, Calendar end,
            Calendar[] existingDates) throws ParseException {
    
        List<Calendar> missingData = new ArrayList<Calendar>();
    
        for(Calendar c=start ; c.compareTo(end)<=0 ; c.roll(Calendar.DAY_OF_MONTH, true) ) {
    
            if(!isInDataSet(c, existingDates)) {
                Calendar c2 = Calendar.getInstance();
                c2.setTimeInMillis(c.getTimeInMillis());
    
                missingData.add(c2);
            }
        }
        return missingData;
    }
    
    protected boolean isInDataSet(Calendar toSearch, Calendar[] dataSet) {
        for(Calendar l : dataSet) {
            if(toSearch.equals(l)) return true;
        }
        return false;
    }