2012-01-20 9 views
1

これは重複した質問 の可能性がありますが依然として尋ねることができます。日付のリストから欠けている日付をすべて取得してください(ソート済み)

私は日付のリスト(日付はソートされていない中である)

1月5日/ 2012,1/10/2012、2012年1月1日、2012年1月7日(MM/DDを/持っていますYYYY)(のみ)は、タイムスタンプを日付なし

まず私は今listOfDatesが順番に日付が含まれていますコレクションref

Collections.sort(listOfDates); 

を使用してすべての日付を並べ替えます。 2011/01/01、2012/1/7、2012年1月7日、

ソートされたリストから欠けている日付をすべて取得するにはどうすればよいですか?

行方不明日付 - 2012年1月6日 2012年1月8日 2012年1月9日

2012年1月2日 2012年1月3日 2012年1月4日、私が持っていますサンプルプログラムではなく、それはアルゴは使用しないで、なぜこのquestion

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

を何を投稿してください私たちがあなたを助けることができるように、サンプルコードで行っています。 – sjngm

答えて

2

から取られた上記の要件

サンプルで作業を取得する方法を確認してくださいそのソートされたセット内の最初と最後の日付は、2つの日付の間の日付のリストを生成するか? This answerjodaTimeを使用します。

0

引数として2つの日付を取り、これらの2つの日付間のすべての日付を生成するメソッドを記述します。ソートされたペアのソートされたペア(この例では、要素iとi + 1など、このループは0からリスト1のサイズです)に対してこのメ​​ソッドを呼び出します。

+1

開始日と終了日の間にすべての日付のセットまたはリストがある場合、実際には 'Set missingDates = allDates; missingDates.removeAll(existingDates); ' –

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 
関連する問題