2017-09-12 26 views
-2

我讀了一些有關compareTo()函數的答案,但我仍然不清楚它是如何在內部工作的。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.id並且是emp.id

基本上我試圖理解,當compareTo()被調用時,然後employee對象empArr成爲當前對象,然後,與哪個對象進行比較。

return (this.id - emp.id); 

那麼,什麼是thisemp

+1

'sort'方法在排序期間需要比較的數組實例中調用'compareTo'。沒有「當前對象」,這是由排序算法的實現驅動的。 – pvg

+0

它可以像任何其他功能一樣工作。它在某個實例上被調用,並且它有一個參數。 – SLaks

+0

如果你把它寫成'public int compareTo(Employee that)',你會發現它更容易理解。你所做的就是將'this'與'that'進行比較。 – EJP

回答

2

那麼什麼是「this」和「emp」?

那麼,看看你在寫什麼方法!這是compareTo方法。可以這樣調用:

a.compareTo(b) 

在這種情況下,athisbemp

然而,究竟什麼是thisempsort方法調用compareTo

爲了找到這個,你需要看看如何實現sort。在我的JDK版本中,sort最終會調用ComparableTrimSort.class中聲明的名爲binarySort的方法。在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是否等於,小於或大於參數。

0

如果您查看compareTo函數中的參數,它具有"Employee emp"作爲參數,Employee是類型,emp是用於引用它的名稱。爲了將對象與另一個對象進行比較,可以使用其中一個對象,並使用compareTo函數將其與另一個進行比較。因此,您需要一種方法來引用當前正在使用的對象,在這種情況下,我們使用this以訪問對象內的變量,並且emp引用作爲參數傳遞的Employee。在這種情況下,this不需要獲取當前對象的id,但在其他情況下,如果存在具有相同名稱的局部變量,則需要執行此操作。