0

我正在尝试使用下面的 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;
}
4

5 回答 5

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);
}
于 2013-04-19T00:42:41.777 回答
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大于则为正,如果等于 ,则为arg0 。thisarg

考虑到这一点,我们开始编码。我们唯一允许比较我们的 Employee 类的是其他Employees - 所以我们将对象arg转换为Employee. 如果不是一个,则会抛出异常。

然后,我们简单地将我们的薪水与其薪水进行比较,并根据两个员工的排序方式返回 1 或 0 或 -1。这允许员工具有自然排序和排序,例如以正确的顺序出现在PriorityQueue容器中。

于 2013-04-19T00:43:11.977 回答
0

首先,我将假设第一个“返回”实际上应该返回 1。

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

于 2013-04-19T00:40:07.757 回答
0

Object 参数意味着您的 compareTo 将接收任何对象,而不仅仅是 Employee 对象。如果您想比较不同类的两个对象,这可能很有用(假设您想比较一个类 Person 和一个类 Dog,如果它们的权重相同,则返回 true)。

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

我建议在您的代码之前添加一个“if (instanceof(Employee))”。这意味着您将仅在 arg 确实是 Employee 的情况下运行您的代码。(例如: if(instanceof(Dog)) 将阻止尝试将 Person 转换为 Dog)。这很有用,因为尝试强制转换不兼容的类型会导致异常。

于 2013-04-19T00:44:41.217 回答
0

我也不明白 Object arg 指的是什么

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

于 2013-04-19T00:50:26.487 回答