4

このJava チュートリアルから抜粋した次のスニペットは、2 番目の引数オブ​​ジェクトを最初のオブジェクトと比較するのではなく、その逆ではありません。*hireDate() メソッドは、その特定の従業員の雇用日を示す Date オブジェクトを返します。

import java.util.*;
public class EmpSort {
    static final Comparator<Employee> SENIORITY_ORDER = 
                                        new Comparator<Employee>() {
            public int compare(Employee e1, Employee e2) {
                return e2.hireDate().compareTo(e1.hireDate());
            }
    };

Javaチュートリアルの説明は次のとおりです。

Comparator は、その逆ではなく、2 番目の引数の雇用日を最初の引数に渡すことに注意してください。その理由は、最近採用された従業員が最も年長ではないためです。入社日順にソートすると、リストは年功序列の逆順になります。

compareToそれでも、 e1 と e2 を逆にすることで問題が解決する理由がわかりません。

さらに明確にすることはありますか?

前もって感謝します。

4

3 に答える 3

11

並べ替え順序を変更する場合は、次を使用します。

Collections.sort(list, Collections.reverseOrder(comparator));

コンパレータで遊んではいけません。

于 2013-04-02T16:22:52.630 に答える
7

日付の自然な順序 ( で定義compareTo) は、後の日付が前の日付よりも「大きい」というものです。年功序列については、そこにいる時間が長い人ほど年上です。つまり、開始日が早い方が遅い日よりも年功序列が高いことを示します。

Comparatorif thenとcompare(a,b) != 0は反対の符号を持つ必要があると規定されているため、 andの逆順の比較を実装する方法には 2 つの選択肢があります。返すか、同じ符号を持つことが保証されます。compare(a,b)compare(b,a)ab-(a.compareTo(b))b.compareTo(a)

それらは必ずしも同じを持つとは限りませんが、コンパレーターの結果にとって重要なのは、それらが であるか><または==0 であるかだけです。多くの例では を使用-1しており、正しい符号を持つ値は問題0ありません。+1

于 2013-04-02T16:16:54.837 に答える