Получить все недостающие даты из списка дат (отсортировано) - PullRequest
1 голос
/ 20 января 2012

Это может быть возможный дубликат вопроса, но он все еще задает.

У меня есть список дат (даты не отсортированы)

1/5 / 2012,1 / 10/ 2012, 01.01.2012, 1/7/2012 (ММ / дд / гггг) (только дата без отметки времени)

Сначала я отсортировал все даты, используя коллекции ref

Collections.sort(listOfDates);

Теперь listOfDates Содержит даты в порядке. 1/1/2012, 1/5/2012, 1/7/2012, 1/10/2012

Как я могу получить все пропущенные даты из отсортированного списка?

пропущенные даты - 1/2/2012 1/3/2012 1/4/2012 1/6/2012 1/8/2012 1/9/2012

У меня есть пример программы, но нетуверен, как заставить его работать с вышеуказанным требованием

Образец алгоритма, взятый из этого вопроса

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 ]

2 голосов
/ 20 января 2012

Почему бы не использовать первую и последнюю даты в этом отсортированном наборе для создания списка дат между двумя датами? Этот ответ использует jodaTime .

1 голос
/ 20 января 2012

Использовать Список-интерфейс s 'метод removeAll-со списком, содержащим даты между самыми низкими (дата начала) и самыми высокими (дата окончания) значениями:

@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
0 голосов
/ 20 января 2012

Напишите метод, который принимает две даты в качестве аргумента и генерирует все даты между этими двумя датами. Теперь вызовите этот метод для отсортированной пары (пример элементов i и i + 1 и т. Д., Цикл от 0 до размера list-1) данных в вашем отсортированном списке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...