Как мне найти ближайшую дату к указанной дате?(Джава) - PullRequest
7 голосов
/ 20 августа 2011

Я надеялся узнать, как набрать метод, чтобы дать мне самую близкую дату к указанной дате. Я имею в виду следующее:

public Date getNearestDate(List<Date> dates, Date currentDate) {
    return closestDate  // The date that is the closest to the currentDate;
}

Я нашел похожие вопросы, но только один из них дал хороший ответ, и код продолжал давать мне исключения NullPointerException ... Кто-нибудь может мне помочь?

Ответы [ 4 ]

14 голосов
/ 20 августа 2011

Вы можете решить в линейном времени, вычислив разницу во времени (например, Date#getTime()) и вернув минимум:

public static Date getNearestDate(List<Date> dates, Date currentDate) {
  long minDiff = -1, currentTime = currentDate.getTime();
  Date minDate = null;
  for (Date date : dates) {
    long diff = Math.abs(currentTime - date.getTime());
    if ((minDiff == -1) || (diff < minDiff)) {
      minDiff = diff;
      minDate = date;
    }
  }
  return minDate;
}

[Редактировать]

Незначительные улучшения производительности.

3 голосов
/ 20 августа 2011

Используйте Date # getTime и вычтите значения. Наименьшим результатом будет ваша ближайшая дата.

2 голосов
/ 20 августа 2011

Упорядочить список по порядку дат и выполнить дихотомический поиск.Помните, что для сравнения дат вы можете использовать Date.getTime (), чтобы получить дату в виде миллисекунд, которые обычно легче сравнивать.

0 голосов
/ 20 августа 2011

Вы бы упорядочили даты по ближайшим.

Дата начала установлена ​​на 0:

long ret = 0;

Теперь вам нужно перебрать свой список и сохранить ближе к желаемой дате

for(Date d : dates){
    if(Math.abs(curDate.getTime() - ret) > Math.abs(curDate.getTime() - d.getTime())){
        ret = d.getTime();
    }
}
return new Date(ret);

Оператор if проверяет, какая дата ближе, сравнивая миллисекундное время. Используя Math.abs, вы исключаете направление (до или после).

...