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() 与雇员的数组列表一起使用。当我打印出来时,我会得到一个按员工类型排序的很好的列表,但它应该按 GrossPay 排序。

4

2 回答 2

6

compareTo 必须返回与总订单一致的结果。否则无法以任何方式保证排序结果。全序意味着 if A<B, thenB>A和 if A==B, then B==A。换句话说,你可以切换this并且other和结果是一致的。即使对于员工类型,您提供的代码也不会这样做。

如果compareTo与总顺序不一致,sort可能会产生错误的答案或永远不会终止。

目前尚不清楚您的系统是否有 3 种类型的员工或 2 种类型的员工。让我们假设它是 2:受薪和每日。然后我们需要解决以下可能性:

this     other    result
------------------------
salaried salaried equal
daily    salaried <
salaried daily    >
daily    daily    equal

只有在我们确定 this 和 other 在员工类型上相等之后,我们才采用辅助排序键,即总工资。

所以编码的一种方法是:

// 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 回答