2010-10-07 80 views
6

我有一個日期列表和當前日期。從列表中找到最近的日期

如何找到最接近當前日期的日期?

+1

你能更具體嗎?這聽起來像你有一個日期列表,你想找到離現在最近的那個?一個簡短的代碼示例將是有幫助的 – 2010-10-07 18:26:45

+0

-1請給出更多詳細信息 – 2010-10-07 19:15:24

回答

2

遍歷所有日期如下:
1.具有保持當前最接近的日期的跟蹤變量
2.有一個變量,它是當前最接近的日期和當前日期之間的差異

當您發現日期的差異小於您在(2)中記錄的差異時,更新差異和當前最近日期

最後,當前最近日期是最接近的日期在集合

這裏的代碼在python:

dates = [date(2010,1,2), date(2010,5,6), date(2010,3,4), date(2011, 1, 2), date(2010,10,20), date(2009,2,3)] 
current_date = dates[0] 
current_min = abs(current_date - date.today()) 
for d in dates: 
    if abs(d - date.today()) < current_min: 
     current_min = abs(d - date.today()) 
     current_date = d 
+0

請給我一些例子 – 2010-10-07 18:32:50

20

我想,根據從當前時間距離「訂單」日期,使用Collection.min使用自定義比較。

final long now = System.currentTimeMillis(); 

// Create a sample list of dates 
List<Date> dates = new ArrayList<Date>(); 
Random r = new Random(); 
for (int i = 0; i < 10; i++) 
    dates.add(new Date(now + r.nextInt(10000)-5000)); 

// Get date closest to "now" 
Date closest = Collections.min(dates, new Comparator<Date>() { 
    public int compare(Date d1, Date d2) { 
     long diff1 = Math.abs(d1.getTime() - now); 
     long diff2 = Math.abs(d2.getTime() - now); 
     return Long.compare(diff1, diff2); 
    } 
}); 
+1

很好的答案... – 2010-10-07 18:36:52

+0

@aioobe:爲什麼我們不能只比較getTime(不是Math.abs(d1.getTime() - 現在))? – 2010-10-07 18:42:50

+2

@Stas:因爲它會以其他順序排列「自然」的日期。我們想按照'now'的順序排列。儘管智能解決方案即使OP是一個混蛋,這也值得+1。 – BalusC 2010-10-07 18:44:16

2

你可以試試這個代碼:

public static Date closerDate(Date originalDate, Collection<Date> unsortedDates) { 
    List<Date> dateList = new LinkedList<Date>(unsortedDates); 
    Collections.sort(dateList); 
    Iterator<Date> iterator = dateList.iterator(); 
    Date previousDate = null; 
    while (iterator.hasNext()) { 
     Date nextDate = iterator.next(); 
     if (nextDate.before(originalDate)) { 
      previousDate = nextDate; 
      continue; 
     } else if (nextDate.after(originalDate)) { 
      if (previousDate == null || isCloserToNextDate(originalDate, previousDate, nextDate)) { 
       return nextDate; 
      } 
     } else { 
      return nextDate; 
     } 
    } 
    return previousDate; 
} 

private static boolean isCloserToNextDate(Date originalDate, Date previousDate, Date nextDate) { 
    if(previousDate.after(nextDate)) 
     throw new IllegalArgumentException("previousDate > nextDate"); 
    return ((nextDate.getTime() - previousDate.getTime())/2 + previousDate.getTime() <= originalDate.getTime()); 
} 
4

如果列表進行排序,那麼你可以使用Collections.binarySearch()以找到指定的日期將被分類到列表中的位置 - 最接近的一種,是無論是在該指數之前還是之後。

對於非常大的列表,這比其他解決方案快得多,但它當然需要對列表進行排序。如果你打算多次執行這樣的查詢,那麼首先對列表進行排序是值得的(性能方面)。

1

如果你可以使用一個Set代替List,就把日期在NavigableSetTreeSet和使用方法lowerhigher

NavigableSet<Date> dates = new TreeSet<Date>(); 
// add some dates to dates 
Date now = new Date(); 
Date highestDateUpUntilNow = dates.lower(now);