在给定日期的几个日期中查找最近的日期

时间:2010-10-07 18:23:14

标签: java

我有一个日期列表和当前日期。如何找到最接近当前日期的日期?

5 个答案:

答案 0 :(得分:22)

我将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 :(得分:4)

如果列表已排序,那么您可以使用Collections.binarySearch()查找给定日期将被排序到列表中的位置 - 最接近的位置在该索引之后或之前。

对于非常大的列表,这比其他解决方案快得多,但当然它确实需要对列表进行排序。如果你要多次进行这样的查询,那么首先对列表进行排序是值得的(性能方面)。

答案 2 :(得分:3)

如果您可以使用Set代替List,请将日期放在NavigableSet中,例如TreeSet,并使用方法lower和{ {1}}。

higher

答案 3 :(得分: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

答案 4 :(得分: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());
}