如何在Java中列出非连续日期数组中缺少的日期?
我有一个按日期排序的数据表,用户可以通过提供开始日期和结束日期从中选择一组数据。数据本身是非连续的,因为我没有周末和公共假日的数据 我希望能够在提取的数据集中列出我没有数据的所有日子。在Java中,是否有一种简单的方法:如何在Java中列出非连续日期数组中缺少的日期?,java,datetime,Java,Datetime,我有一个按日期排序的数据表,用户可以通过提供开始日期和结束日期从中选择一组数据。数据本身是非连续的,因为我没有周末和公共假日的数据 我希望能够在提取的数据集中列出我没有数据的所有日子。在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;
}