我遇到了覆盖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排序。
答案 0 :(得分:6)
compareTo
必须返回与总订单一致的结果。否则,无法以任何方式保证排序结果。总订单表示如果A<B
,B>A
和A==B
,则B==A
。换句话说,您可以切换this
和other
,结果也是一致的。即使对于员工类型,您提供的代码也不会这样做。
如果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();
}