5

次の出力を理解しようとしています。

public class CommunicationComparator implements Comparator<Communication> {
    @Override
    public int compare(Communication comm1, Communication comm2) {
        long t1 = comm1.getDate().getTime();
        long t2 = comm2.getDate().getTime();
        return (int) (t2 - t1);
    }
}

getDate()メソッドはjava.sql.Timestampを返します。

並べ替え前の出力は次のとおりです。

for (Communication n : retVal) {
    System.out.println(n.getDate().toString());
}

2012-10-03 10:02:02.0
2012-10-07 03:02:01.0
2012-10-08 13:02:02.0
2012-10-09 03:02:00.0
2012-11-26 10:02:05.0
2012-11-28 11:28:11.0
2012-12-03 12:03:01.0
2012-12-06 15:03:01.0
2012-12-13 14:03:00.0
2012-12-28 11:03:00.0
2012-12-28 13:49:21.0

以降:

Collections.sort(retVal, new CommunicationsComparator());

2012-12-13 14:03:00.0
2012-12-06 15:03:01.0
2012-12-03 12:03:01.0
2012-11-28 11:28:11.0
2012-10-09 03:02:00.0
2012-10-08 13:02:02.0
2012-11-26 10:02:05.0
2012-10-07 03:02:01.0
2012-10-03 10:02:02.0
2012-12-28 13:49:21.0
2012-12-28 11:03:00.0

下の2つのオブジェクトが正しくソートされない理由はありますか?このタイムスタンプのMySQLJDBC実装を使用しています。

4

5 に答える 5

18

最後の 2 つの日付とそれより前の日付の差は、オーバーフロー整数になります。

おそらく、より良い解決策は、値を減算するのではなく、値を比較することです。

    long t1 = comm1.getDate().getTime();
    long t2 = comm2.getDate().getTime();
    if(t2 > t1)
            return 1;
    else if(t1 > t2)
            return -1;
    else
            return 0;
于 2013-01-02T16:21:00.620 に答える
6

差が約 25 日よりも大きい場合、オーバーフローが発生します。(int は、ミリ秒単位で約 25 日よりも大きな時差を表すことはできません)。これにより、比較が不正確になります。

これは、return ステートメントを次のように変更することで解決できます。

return Long.signum(t2 - t1);
于 2013-01-02T16:19:00.993 に答える
6

使用できます

return Long.compare(t2, t1);

ただし、日付を比較する方がよいでしょう。

return comm2.getDate().compareTo(comm1.getDate());
于 2013-01-02T16:35:52.760 に答える
4

私の最初の考えは、問題はオーバーフローであるということです。 t1そしてsですt2long違いは int に収まらない場合があります。

私はそれをチェックします。

第 2 レベルでの比較で十分な場合は、次のことを試してください。

return (int) ((t2 - t1)/1000);

これは、オーバーフローがないことを保証するものではありません。少なくともテストを追加します。

最良の答えは私のものではないと思います。私のお気に入りは:

    if(t2 > t1)
        return 1;
    else if(t1 > t2)
        return -1;
    else
        return 0;
于 2013-01-02T16:15:51.500 に答える