3

私は、日付間で何千もの比較を実行して、それらが同じ月にあるかどうかを確認するプロジェクトに取り組んでいます。それを行う最も効率的な方法は何でしょうか。

これは私のコードが正確にどのように見えるかではありませんが、ここに要点があります:

List<Date> dates = getABunchOfDates();
Calendar month = Calendar.getInstance();
for(int i = 0; i < numMonths; i++) 
{
    for(Date date : dates)
    {
        if(sameMonth(month, date)
            .. doSomething
    }
    month.add(Calendar.MONTH, -1);
}

この比較が何千回も行われる場合、日付ごとに新しいCalendarオブジェクトを作成することはかなり大きなオーバーヘッドのように思われるので、少しごまかして非推奨の方法Date.getMonth()を使用したいと思います。Date.getYear()

public static boolean sameMonth(Calendar month, Date date)
{
    return month.get(Calendar.YEAR) == date.getYear() && month.get(Calendar.MONTH) == date.getMonth();
}

この方法が最も速いように見えるので、私はこの方法を使用することにかなり近いですが、より速い方法はありますか? そして、メソッドが非推奨になっているので、これは愚かな方法ですか?Date注:このプロジェクトは常にJava7で実行されます

4

2 に答える 2

2

非推奨のメソッドを使用するかどうかについてコメントすることはできませんが、使用しないことを選択した場合、チェックCalendarするたびに新しいインスタンスを作成する必要はありません。Dateもう1つを使用して、チェックの前にCalendar呼び出します(または、並列化する場合はスレッドごとに1つ)。setTime(date)Calendar

補足として、これはデータベースに値するものであるという ChristopheD のコメントに同意する必要があります。

于 2012-11-07T23:01:16.690 に答える
0

DateFormat月と年を抽出する静的を定義し、Date両方のオブジェクトを日付のみとして使用 できると思います。

    public static DateFormat formatter= new SimpleDateForm("MMyyyy");
    public static boolean sameMonth(Date date1, Date date2)
    {
      return formatter.format(date1).equals(formatter.format(date2));
    }
于 2012-11-07T23:02:20.183 に答える