CompareTo Override Sort

时间:2012-06-17 01:49:17

标签: java compareto

我遇到了覆盖compareTo方法的问题。该程序模拟不同的员工类型,我按照员工类型完美排序,但无法通过总薪酬进行二次排序。一旦按类名/员工类型排序,它就需要按粗略排序,我可以通过帮助方法获得。以下是代码:

  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()和雇员的arraylist。当我打印出来时,我会按员工类型获得一个很好的排序列表,但是应该按照grossPay排序。

2 个答案:

答案 0 :(得分:6)

compareTo 必须返回与总订单一致的结果。否则,无法以任何方式保证排序结果。总订单表示如果A<BB>AA==B,则B==A。换句话说,您可以切换thisother,结果也是一致的。即使对于员工类型,您提供的代码也不会这样做。

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

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

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

只有在我们确定这个和其他人在员工类型上相同之后,我们才会采用二级排序密钥,即总薪酬。

所以编码的一种方法是:

// 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方法应保留用于“自然”排序顺序,例如用作主键的唯一标识号的数字顺序。这种排序标准似乎并不“天生”。

答案 1 :(得分: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();
}