从日期列表中获取所有缺少的日期(已排序)

时间:2012-01-20 17:13:24

标签: java collections hashmap

这可能是一个可能重复的问题 但还在问。

我有一个日期列表(日期未分类)

1/5 / 2012,1 / 10 / 2012,1 / 1 / 2012,1 / 7/2012 (MM / dd / yyyy)(仅限日期没有时间戳)

首先,我使用集合ref

对所有日期进行了排序
Collections.sort(listOfDates);

现在listOfDates按顺序包含日期。 1/1/2012,1/5/2012,1/7 / 2012,1 / 10/2012

如何从排序列表中获取所有缺少的日期?

缺少日期 - 2012/1/2 2012/1/3 2012/1/4 1/6/2012 2012年1月8日 1/9/2012

我有一个示例程序,但不确定如何使用上述要求

来自此question

的示例Algo
if (listOfDates!=null && !listOfDates.isEmpty()) {
 Date firstDate = listOfDates.get(0) //contains the start date
 Date lastDate = listOfDates.get(listOfDates.size()-1); //contains end date 
}

3 个答案:

答案 0 :(得分:2)

为什么不使用该有序集中的第一个和最后一个日期来生成两个日期之间的日期列表? This answer使用jodaTime

答案 1 :(得分:1)

使用List-interface s'removeAll -method,列表中包含最低(开始日期)和最高(结束日期)值之间的日期:

@Test
public void testAddMissingDates()
{
    List<Date> listOfDates = new ArrayList<Date>();
    //1/1/2012, 1/5/2012, 1/7/2012, 1/10/2012
    Calendar cal = Calendar.getInstance();
    cal.setTimeInMillis(0); //To zero out hour, minute, second ...
    cal.set(2012, 0, 1);    //Calendar.set: Month value is 0-based. e.g., 0 for January.
    listOfDates.add(cal.getTime());
    cal.set(2012, 0, 5);
    listOfDates.add(cal.getTime());
    cal.set(2012, 0, 7);
    listOfDates.add(cal.getTime());
    cal.set(2012, 0, 10);
    listOfDates.add(cal.getTime());

    Collections.sort(listOfDates);

    List<Date> resultingDates = generateDateListBetween(listOfDates.get(0), listOfDates.get(listOfDates.size()-1));

    //Remove all dates in listOfDates
    resultingDates.removeAll(listOfDates);

    for(Date date : resultingDates)
    {
        System.out.println(date);
    }       
}

private List<Date> generateDateListBetween(Date startDate, Date endDate)
{
    //Flip the input if necessary, to prevent infinite loop
    if(startDate.after(endDate))
    {
        Date temp = startDate;
        startDate = endDate;
        endDate = temp;
    }

    List<Date> resultList = new ArrayList<Date>();
    Calendar cal = Calendar.getInstance();
    cal.setTime(startDate);

    do
    {
        resultList.add(cal.getTime());
        cal.roll(Calendar.DAY_OF_MONTH, true);  //Roll one day forwards         
    }
    while(cal.getTime().before(endDate));

    return resultList;
}

输出:

Mon Jan 02 02:00:00 EET 2012
Tue Jan 03 02:00:00 EET 2012
Wed Jan 04 02:00:00 EET 2012
Fri Jan 06 02:00:00 EET 2012
Sun Jan 08 02:00:00 EET 2012
Mon Jan 09 02:00:00 EET 2012

答案 2 :(得分:0)

编写一个以两个日期作为参数的方法,并生成这两个日期之间的所有日期。现在为排序列表中的数据的排序对(示例元素i和i + 1,依此类推,循环从0到list-1的大小)调用此方法。