は、合計順序と一致する結果を返すcompareTo 必要があります。そうしないと、並べ替えの結果が保証されません。全順序とは、 if A<B、 thenB>Aおよび if A==B、 then を意味しB==Aます。thisつまり、とを切り替えることができother、結果は一貫しています。あなたが提示するコードは、従業員タイプであってもこれを行いません。
compareToat 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 番号の数値順など、「自然な」並べ替え順序用に予約する必要があります。このソート基準は「自然」ではないようです。