は、合計順序と一致する結果を返すcompareTo
必要があります。そうしないと、並べ替えの結果が保証されません。全順序とは、 if A<B
、 thenB>A
および if A==B
、 then を意味しB==A
ます。this
つまり、とを切り替えることができother
、結果は一貫しています。あなたが提示するコードは、従業員タイプであってもこれを行いません。
compareTo
at total order と一致しない場合sort
、間違った答えが生成されるか、終了しない可能性があります。
システムに従業員のタイプが 3 種類あるのか 2 種類あるのかは明確ではありません。2 種類の従業員 (サラリーマンと日雇い) を想定しましょう。次に、可能性を検討する必要があります。
this other result
------------------------
salaried salaried equal
daily salaried <
salaried daily >
daily daily equal
this と other の従業員タイプが等しいことを確認してから、2 番目のソート キーである総賃金を取得します。
したがって、これをコーディングする1つの方法は次のとおりです。
// Assume this and o have type Daily or Salaried.
public int compareTo(Object o) {
if (this instanceof Daily && o instanceof Salaried) return -1;
if (this instanceof Salaried && o instanceof Daily) return +1;
// The employee types must be equal, so make decision on pay.
Employee e = (Employee)o;
return grossPay() < e.grossPay() ? -1 :
grossPay() > e.grossPay() ? +1 : 0;
}
で実装されていると思いEmployee
ます。
最後に、このソートはComparator
. このcompareTo
メソッドは、主キーとして機能する一意の ID 番号の数値順など、「自然な」並べ替え順序用に予約する必要があります。このソート基準は「自然」ではないようです。