在实现 Comparable 接口的 class 中调用 collections.sort() 方法时引用的当前对象是什么?

what is the current object referred to while calling collections.sort() method inside a class which implements Comparable interface?

public class TestSort3{  
    public static void main(String args[]){  
        ArrayList<Student> al=new ArrayList<Student>();  
        al.add(new Student(101,"Vijay",23));  
        al.add(new Student(106,"Ajay",27));  
        al.add(new Student(105,"Jai",21));  

        Collections.sort(al);  
        for(Student st:al){  
            System.out.println(st.rollno+" "+st.name+" "+st.age);  
        }  
    }  
}  

compareTo的定义为:

class Student implements Comparable <Student> {
    int rollno;
    String name;
    int age;
    Student(int rollno, String name, int age) {
        this.rollno = rollno;
        this.name = name;
        this.age = age;
    }

    public int compareTo(Student st) {
        if (age == st.age)
            return 0;
        else if (age > st.age)
            return 1;
        else
            return -1;
    }
}

我无法获得在 compareTo 方法中比较年龄的逻辑。当Collections.sort()方法被调用时,compareTo()会被调用并且我们已经传递了ArrayList的实例,所以它需要Student的实例传递class,现在与之比较的另一个 Student 实例是哪个?

我已经查看了与此方法相关的其他 Whosebug 链接,但我无法澄清我的疑问,请澄清这一点。

  • 每个学生对象都将与其他学生对象进行比较 你的清单。
  • 因此,当一个学生对象年龄将与作为参数传递到 compareTo 方法中的其他学生对象年龄进行比较时。

假设我们有如下三个学生。

Student vijay = new Student(101, "vijay", 23);
Student ajay= new Student(106, "Ajay", 27); 
Student jai= new Student(105, "jai", 21);
  • 你有一个学生 vijaynew Student(101,"Vijay",23)
  • compareTo() 方法正在 vijay 中调用,它将与 new Student(106,"Ajay", 26 ) 定义的 ajay 进行比较。
  • compareTo() 方法的实现方式是比较 age 并且 vijay 在逻辑上小于 Ajay.
  • 返回 0 表示对象在逻辑上相等
  • 返回负整数意味着 this 对象小于传递给 compareTo 方法的对象。
  • 返回正整数意味着 this 对象在逻辑上大于传递给 compareTo() 方法的对象。

总的来说, - vijay 将与 ajay 进行比较,并且由于我们的实施,vijay 在逻辑上小于 ajay。 - ajay 将与 jai 进行比较,并且 ajay 在逻辑上将大于 jai

所有组合的元素都会发生这种过程,最终结果将按年龄递增的顺序排列,即jai < vijay < ajay

在java中实现了不同的排序算法,这些算法将根据与我们的问题无关的特定场景来选择。

this 只是指调用 compareTo 的对象。在调用 Collections.sort 的情况下,它可能是集合中的任何成员。

让它不那么抽象:

为了使用 compareTo,必须这样调用它:

a.comparTo(b)

其中 ab 都是 Student 的实例。 Collections.sort 正是这样做的(尽管实际调用似乎是在 [Arrays.mergSort][1] 中)。使用哪个实例的细节取决于实现的排序算法和集合中元素的初始顺序。