Java 比较过边排序

Java 比较过边排序,java,compareto,Java,Compareto,我在比较方法时遇到了一个问题。该程序模拟了不同的员工类型,我让它完美地按员工类型排序,但无法让它按总工资进行二次排序。一旦它按类名/雇员类型排序,它就需要按grossPay排序,我可以通过助手方法获得grossPay。代码如下: public int compareTo(Object o) { Employee other = (Employee) o; if(other instanceof Salaried) return -1; else

我在比较方法时遇到了一个问题。该程序模拟了不同的员工类型,我让它完美地按员工类型排序,但无法让它按总工资进行二次排序。一旦它按类名/雇员类型排序,它就需要按grossPay排序,我可以通过助手方法获得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()和employess的arraylist。当我打印出来时,我得到了一个按员工类型排序的列表,但它应该按grossPay排序。

在比较类型之后,您可以比较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();
}

compareTo
必须返回与总订单一致的结果。否则,无法以任何方式保证排序结果。总订单意味着如果
AA
A==B
,则
B==A
。换句话说,您可以切换
this
other
,结果是一致的。即使对于员工类型,您提供的代码也不会执行此操作

如果
compareTo
与at total order不一致,
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;
}
//假设该类型为Daily或Salaried。
公共整数比较对象(对象o){
如果(每日的此实例和受薪的(&o实例)返回-1;
如果(受薪员工的此实例和&o每日实例)返回+1;
//员工类型必须相同,因此要决定薪酬。
雇员e=(雇员)o;
返回grossPay()e.grossPay()?+1:0;
}
我假设这是在
Employee
中实现的


最后,使用
比较器实现这种排序可能更好。
compareTo
方法应保留为“自然”排序顺序,例如用作主键的唯一id号的数字顺序。这种排序标准似乎不是“自然的”。

您可能想看看。它(据我所知)基本上回答了您的问题。请关闭,但由于可能会溢出,您不应该使用整数减法来实现
compareTo
。如果
getGrossPay()
已经返回了
整数
值,可以使用Integer.compare,但对于原语,请坚持使用
。在Java7中,有一种静态方法
Integer.compare(int,int)
。不幸的是,这种方法不一定有效。如果
是受薪的,而
其他
是受薪的,则返回
-1
。如果交换两个操作数,它将再次返回
-1
。因此,比较与总体顺序不一致。排序可能会产生错误的答案或永远不会终止。@TedHopp谢谢您的建议。我认为格罗斯佩的价值应该是正面的。所以它不会溢出来。