7

指定された日付に最も近い日付を取得する方法を入力する方法を知りたいと思っていました。私が意味するのは、次のようなものです。

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

同様の質問を見つけましたが、良い答えが得られたのは1つだけで、コードからNullPointerExceptionsが返され続けました...誰か助けてくれますか?

4

4 に答える 4

14

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;
}

[編集]

マイナーなパフォーマンスの向上。

于 2011-08-20T00:35:11.067 に答える
3

Date#getTimeを使用して値を減算します。最小の結果は、最も近い日付になります。

于 2011-08-20T00:25:52.783 に答える
2

リストを日付順に並べ替え、二分検索を実行します。日付を比較するには、Date.getTime() を使用して日付をミリ秒単位で取得できることに注意してください。これは通常、比較が簡単です。

于 2011-08-20T00:26:47.500 に答える
0

日付は近い順に並べます。

開始日を 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 を使用すると、方向 (前または後) がなくなります。

于 2011-08-20T00:34:08.577 に答える