0

compareTo メソッドのオーバーライドに問題があります。このプログラムはさまざまな従業員タイプをシミュレートし、従業員タイプで完全にソートしていますが、総賃金で二次ソートすることはできません。クラス名/従業員タイプで並べ替えたら、ヘルパー メソッドで取得できる GrossPay で並べ替える必要があります。以下はコードです:

  public int compareTo(Object o) {

    Employee other = (Employee) o;

    if(other instanceof Salaried)
        return -1;

    else if(other instanceof Daily)
         return 1; 

    else
        return 0;
}

従業員の配列リストで Collection.sort() を使用しています。印刷すると、従業員の種類別に並べ替えられた優れたリストが得られますが、その後は総支払額で並べ替える必要があります。

4

2 に答える 2

6

は、合計順序と一致する結果を返す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 番号の数値順など、「自然な」並べ替え順序用に予約する必要があります。このソート基準は「自然」ではないようです。

于 2012-06-17T02:13:36.880 に答える
3

タイプを比較した後、grossPayを比較できます。仮定grossPayは数値です。

public int compareTo(Object o) {

    Employee other = (Employee) o;
    if(this instanceof Daily && other instanceof Salaried)
        return -1;

    else if(this instanceof Salaried && other instanceof Daily)
        return 1; 

    else
        return this.getGrossPay() - other.getGrossPay();
}
于 2012-06-17T02:00:13.290 に答える