compareTo()如何工作

时间:2017-09-12 16:49:00

标签: java collections

我读了一些关于compareTo()函数的答案,但我还不清楚它是如何在内部工作的。

我有以下代码片段,我正在努力理解。

public class Employee implements Comparable<Employee> {

    private int id;
    private String name;
    private int age;
    private long salary;

    public int getId() {
        return id;
    }

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }

    public long getSalary() {
        return salary;
    }

    public Employee(int id, String name, int age, int salary) {
        this.id = id;
        this.name = name;
        this.age = age;
        this.salary = salary;
    }

    @Override
    public int compareTo(Employee emp) {
        //let's sort the employee based on id in ascending order
        //returns a negative integer, zero, or a positive integer as this employee id
        //is less than, equal to, or greater than the specified object.
        return (this.id - emp.id);
    }

}

一个CompareClass为:

public class CompareClass {

    public static void main(String[] args) {
        // TODO Auto-generated method stub

        Employee[] empArr = new Employee[4];
        empArr[0] = new Employee(10, "Mikey", 25, 10000);
        empArr[1] = new Employee(20, "Arun", 29, 20000);
        empArr[2] = new Employee(5, "Lisa", 35, 5000);
        empArr[3] = new Employee(1, "Pankaj", 32, 50000);

        //sorting employees array using Comparable interface implementation
        Arrays.sort(empArr);
        System.out.println("Default Sorting of Employees list:\n"+Arrays.toString(empArr));

    }

}

所以当调用Arrays.sort(empArr)时,然后在compareTo()内,this.idemp.id

基本上我试图理解,当compareTo()被调用时,来自employee的{​​{1}}对象成为当前对象,然后,它将与哪个对象进行比较。

empArr

那么return (this.id - emp.id); this是什么?

2 个答案:

答案 0 :(得分:2)

  

那么&#34;这个&#34;和&#34; emp&#34; ?

那么,看看你在写什么方法!这是compareTo方法。它可以像这样调用:

a.compareTo(b)

在这种情况下,athisbemp

this方法调用emp 时,sortcompareTo 实际上是什么?

要找到这一点,您需要了解sort的实施方式。在我的JDK版本中,sort最终调用binarySort中声明的名为ComparableTrimSort.class的方法。在binarySort中,有以下几行:

while (left < right) {
    int mid = (left + right) >>> 1;
    if (pivot.compareTo(a[mid]) < 0) // <--- here is the compareTo call
        right = mid;
    else
        left = mid + 1;
}
assert left == right;

sort也可能会在很多其他地方调用compareTo。我的建议是不关心sort做什么,只需实现compareTo方法。返回一个值,指示this是否等于,小于或大于参数。

答案 1 :(得分:0)

如果查看compareTo函数上的参数,它有"Employee emp"作为参数,Employee是类型,emp是用来引用它的名称。为了将对象与另一个对象进行比较,可以使用其中一个对象并使用compareTo函数将其与另一个对象进行比较。因此,您需要一种方法来引用当前使用的对象,在这种情况下,我们使用this来访问对象内部的变量,并使用emp来引用作为传递的Employee参数。在这种情况下,this不是获取当前对象的id所必需的,但在其他情况下,如果存在具有相同名称的局部变量,则需要执行此操作。