2017-09-12 10 views
-2

J'ai lu quelques réponses concernant la fonction compareTo() mais je ne sais toujours pas comment cela fonctionne en interne. J'ai l'extrait de code ci-dessous que j'essaie de comprendre.Comment fonctionne 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); 
    } 

} 

Et un CompareClass comme:

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)); 

    } 

} 

Alors, quand Arrays.sort(empArr) est appelé, puis à l'intérieur compareTo(), qui est le this.id et qui est emp.id?

Fondamentalement, j'essaie de comprendre, quand compareTo() est appelé, puis employee objet de empArr devient l'objet actuel, puis, avec quel objet il est comparé.

return (this.id - emp.id); 

Alors quel est this et emp?

+1

La méthode 'sort' appelle' compareTo' sur les instances du tableau qui doivent être comparées pendant le tri. Il n'y a pas d '"objet courant", ceci est piloté par l'implémentation de l'algo de tri. – pvg

+0

Cela fonctionne comme n'importe quelle autre fonction. Il est appelé sur une instance, et il a un paramètre. – SLaks

+0

Vous trouverez cela beaucoup plus facile à comprendre si vous l'écrivez comme 'public int compareTo (Employee that)'. Tout ce que vous faites est de comparer "ceci" à "ça". – EJP

Répondre

2

alors qu'est-ce que "this" et "emp"?

Eh bien, regardez quelle méthode vous écrivez! C'est la méthode compareTo. Il peut être appelé comme ceci:

a.compareTo(b) 

Dans ce cas, a est this, b est emp.

Mais ce qui est en fait this et emplorsque la méthode sort appelle compareTo?

Pour le savoir, vous devez regarder comment sort est implémenté. Dans ma version du JDK, sort appelle finalement une méthode appelée binarySort déclarée dans ComparableTrimSort.class. En binarySort, il y a ces lignes:

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 pourrait appeler compareTo dans beaucoup d'autres endroits. Ma suggestion est de ne pas se soucier de ce que fait sort, il suffit d'implémenter la méthode compareTo. Renvoie une valeur indiquant si this est égal, inférieur ou supérieur au paramètre.

0

Si vous regardez le paramètre sur la fonction compareTo, il a "Employee emp" comme paramètre, Employee étant le type et emp étant le nom utilisé pour s'y référer. Pour comparer un objet avec un autre, vous utilisez un des objets et utilisez la fonction compareTo pour le comparer avec un autre. Pour cette raison, vous avez besoin d'un moyen de se référer à l'objet courant utilisé, dans ce cas, nous utilisons this pour avoir accès aux variables à l'intérieur de l'objet, et emp pour faire référence à l'employé qui a été passé en paramètre. Dans ce cas, this n'est pas nécessaire pour obtenir l'ID de l'objet actuel, mais dans d'autres cas, vous devez le faire s'il existe une variable locale avec le même nom.