2013-04-19 132 views
0

我想使用下面的compareTo方法对数组进行排序。我很难理解它究竟做了什么。我也没有得到Object arg指的是什么。任何人都可以向我解释这种方法到底是什么以及它是如何工作的?下面的代码是我一直努力着......compareTo方法:Object arg?

public int compareTo (Object arg) 
{ 
    if (salary > ((Employee)arg).salary) 
     return; 
    else if (salary == ((Employee)arg).salary) 
     return 0: 
    else 
     return -1; 
} 
+0

请在您的代码之前添加一行以使其出现在代码块中:) –

+0

谢谢!对不起,我是 – Mike

+0

的新手,它看起来像是将Employee的对象工资(或其子类)与工资实例变量进行比较。 – Ivo

回答

1

首先,有一个错误 - 第一回应该是return 1

public int compareTo (Object arg) 
{ 
    if (salary > ((Employee)arg).salary) 
     return 1; 
    else if (salary == ((Employee)arg).salary) 
     return 0: 
    else 
     return -1; 
} 

现在,我们来看看代码。

要注意的第一件事是,我们要编码的合同 - 特别是Comparable接口,这就需要你有一个方法compareTo,它有一个参数,调用它arg,并返回一个int。如果this小于arg,则int必须为负,如果this大于arg则为正,如果this等于arg,则该值为0。

考虑到这一点,我们开始编码。我们允许员工类别与其他员工进行比较的唯一因素是 - 因此我们将对象arg转换为Employee。如果它不是一个,就会抛出异常。

然后,我们简单地将我们的工资与其工资进行比较,并根据两位员工的订单情况返回1或0或-1。这允许员工进行自然排序并进行排序,以便在容器中以正确的顺序出现。

0

首先,我要承担起第一“回归”实际上应该返回1

它是什么做的是返回一个排序。通过返回1,它表示对象'arg'应该在当前对象之后出现(即它应该具有更高的索引)。类似地,值-1表示它应该在BEFORE之前,而值为0意味着它是相等的,并且排序并不重要(尽管不同的排序算法可能与这些元素有不同的表现,称为stable sorting的属性)。

1

compareTo正在比较thisarg,所以arg是你所比较的。实际上,这段代码似乎通过比较员工的薪水来比较。 假设说return;行,就是要return 1;,代码可以写成

public int compareTo (Object arg) 
{ 
    Integer thisSalary = this.salary; 
    Integer otherSalary = ((Employee) arg).salary; 
    return thisSalary.compareTo(otherSalary); 
} 
0

Object arg表示您的compareTo将接收任何对象,而不仅仅是Employee对象。如果你想比较两个不同类的对象,这可能是有用的(想象一下你想比较一个类Person和一个类Dog,如果它们都具有相同的权重,则返回true)。

在这种特殊情况下,您将arg转换为Employee,这意味着您将把特定对象视为Employee实例。

我建议在代码之前添加一个“if(instanceof(Employee))”。这意味着你只能运行你的代码,以防arg实际上是一个Employee。 (例如:if(instanceof(Dog))将阻止尝试将Person转换为Dog)。这是有用的,因为试图转换不兼容的类型会导致异常。

0

我还没有得到什么对象ARG是指

为了对项目进行排序的数组,你必须要能够抓住项目之一,并将其​​与另一个项目。许多这样的比较需要进行以便对项目进行完全分类。 compareTo()是您在类中定义的数组中所有项都属于的方法。 compareTo()方法允许排序例程获取数组中的一个项目,并在该项目上调用compareTo()。 compareTo()函数的参数是数组中的另一项。 compareTo()方法的返回值告诉排序例程如何排序这两个项目。