2017-09-12 12 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); 
    } 

} 

そして1 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)this.idとどのemp.idである、そしてcompareTo()の内側に、呼び出されたとき?

compareTo()が呼び出されると、employeeのオブジェクトがempArrから現在のオブジェクトになり、次にどのオブジェクトで比較されているのかを理解しようとしています。

return (this.id - emp.id); 

だからthisemp何ですか?

+1

'sort'メソッドは、ソート中に比較する必要がある配列内のインスタンスに対して' compareTo'を呼び出します。 「現在のオブジェクト」はありません。これは、ソート・アルゴの実装によって駆動されます。 – pvg

+0

他の機能と同様に機能します。場合によっては呼び出され、パラメータがあります。 – SLaks

+0

'public int compareTo(Employee that)'と書くと、理解しやすくなります。あなたがしていることは、「これ」と「それ」を比較することだけです。 – EJP

答えて

2

"this"と "emp"とは何ですか?

あなたが書いている方法を見てください。それはcompareToの方法です。 abempで、thisあり、この場合、

a.compareTo(b) 

:それはこのように呼び出すことができます。

しかし、実際にthisempsort方法はcompareToを呼び出し、何ですか?

これを確認するには、sortの実装方法を確認する必要があります。私のJDKのバージョンでは、sortは、最終的にというメソッドをComparableTrimSort.classで宣言しています。

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を呼ぶかもしれない:binarySortでは、これらの線があります。私の提案は、sortが何をしているか気にしないことです。compareToメソッドを実装するだけです。 thisがパラメータと等しいか、小さいか、大きいかを示す値を返します。

0

compareToファンクションのパラメータを参照すると、パラメータには"Employee emp"があり、Employeeはタイプであり、empは参照に使用される名前です。オブジェクトを別のオブジェクトと比較するには、オブジェクトの1つを使用してcompareTo関数を使用して別のオブジェクトと比較します。このため、現在使用されているオブジェクトを参照する方法が必要です。この場合、オブジェクト内の変数にアクセスするためにthisを使用し、パラメータとして渡されたEmployeeを参照するempを使用します。この場合、thisは現在のオブジェクトのIDを取得する必要はありませんが、同じ名前のローカル変数がある場合は、それを行う必要があります。

関連する問題