0

セットがソートされたリストから重複を削除しないのはなぜですか? 最初に印刷された行が示す日付を昇順に並べ替えましたが、セットは重複を削除していません。何故ですか ?プログラムは次のように出力します
。 2009 年 4 月 20 日月曜日 12:27:47 CDT、2009 年 4 月 20 日月曜日 12:27:47 CDT]

セットを作成すると、重複する日付がコレクションから削除されませんか?

    def void testLoadDoc()
     {
     Date date1 = getCurrentDate(3,20,2009)
     Date date2 = getCurrentDate(11,20,2009)
     Date date3 = getCurrentDate(3,20,2009)


     List<Date> dates = new ArrayList<Date>();
     dates.add(date2);
     dates.add(date1);
     dates.add(date3);

     Collections.sort(dates, new CurrencyDateComparator());
     Set uniqueDates = new HashSet(dates)

     println dates
     println uniqueDates

 }


 private Date getCurrentDate(int month, int day, int year)
 {

     Calendar cal = Calendar.getInstance();
     cal.set(YEAR, year);
     cal.set(MONTH, month);
     cal.set(DAY_OF_MONTH, day);
     return cal.getTime();

 }
}

class CurrencyDateComparator implements Comparator
{
    /* (non-Javadoc)
     * @see java.util.Comparator#compare(java.lang.Object, java.lang.Object)
     */
    public int compare(Object arg0, Object arg1)
    {
        Date p = (Date) arg0;
        Date q = (Date) arg1;

        if (p.before(q))
        {
            return -1;
        }
        else if (p.after(q))
        {
            return 1;
        }
        else
        {
            return 0;
        }
    }

    public boolean equals(Object o)
    {
        if (o instanceof CurrencyDateComparator)
        {
            CurrencyDateComparator c = (CurrencyDateComparator) o;

            return this.equals(o);
        }
        else
        {
            return false;
        }
    }
4

5 に答える 5

3

すべての日付には異なるミリ秒値があり、トレースには出力されません。ミリ秒を 0 に設定します。

于 2013-01-23T18:35:18.643 に答える
1

初め

java.util.Date時間情報を運ぶため、時間情報をゼロにしてから、設定したいものを設定するか、 custom 内の比較から時間部分を除外する必要がありますComparator

2番

あなたのカスタムComparatorはバグが多く冗長です。java.util.Dateは既に実装されているComparableため、日付を再度比較する必要はありません.compare()。最初のDateインスタンスで 2 番目のインスタンスを引数として呼び出すだけです。

三番

またMONTHS、Caledar を拠点とする ZERO であることも忘れないでください。1月==0ない1

第4

toString()デフォルトのonに決して依存しないでください。 ( )を含むタイム スタンプ全体をミリ秒単位で表示java.util.Dateするインスタンスを常に使用してください。SimpleDateFormatterTimeZoneyyyy-MM-dd'T'HH:mm:ssZUTC

于 2013-01-23T18:35:56.877 に答える
0

使用するCalendar.getInstance()と、「今」をミリ秒の精度で返します。YMDフィールドを変更しても、そのいずれもクリアされないため、2つの日付が1ミリ秒または20ミリ秒ずれている可能性があります。これは、toString()出力が表示されるデフォルトの実装には含まれていません。

カレンダーを特定の時間に設定する場合は、clear()フィールドの設定を開始する前に、最初にカレンダーを設定するのが最も簡単です。

于 2013-01-23T18:38:08.327 に答える
0

を呼び出すと、現在の時刻で初期化されたCalendar.getInstance()が取得されます。Calendarこれには、時間、分、秒、およびミリ秒が含まれます。clearTime()それらをゼロにするためにそれを呼び出します。

于 2013-01-23T18:39:06.660 に答える
0

代わりにこのコレクションを使用できます

Set<Date> dates = new TreeSet<Date>(CurrencyDateComparator.INSTANCE);
dates.add(date2);
dates.add(date1);
dates.add(date3);

enum CurrencyDateComparator implements Comparator<Date> {
    INSTANCE;

    static final long MILLI_PER_DAY = 86400000L;
    public int compare(Date d1, Date d2) {
        // older versions of Java can use Double.compare()
        return Long.compare(d1.getTime() / MILLIS_PER_DAY, d2.getTime() / MILLIS_PER_DAY);
    }
}
于 2013-01-23T18:43:33.003 に答える