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 号的数字顺序。这种排序标准似乎不是“自然的”。