compareTo() 方法如何工作 ArrayList 排序

How compareTo() method work ArrayList Sorting

我是 Java 的新手,尝试学习 Java 集合并尝试使用可比较的界面对 arraylist 进行排序。我遵循了一些教程,但我无法理解此处的 compareto() 方法中发生了什么。这是我的代码。

Student.java

package arraylistexample;

public class Student implements Comparable<Student>{
    private String studentName;
    private int age;
    private int rollno;

    public Student(String studentName, int age, int rollno){
        this.studentName=studentName;
        this.age=age;
        this.rollno=rollno;
    }

    public String getStudent(){
        return studentName;

    }

    public int getAge(){
        return age;
    }

    public int getRollno(){
        return rollno;
    }

     public void setStudent(String Student){
        studentName=Student;
    }

    public void setAge(int age){
        this.age=age;
    }  

    public void setRollno(int rollno){
        this.rollno=rollno;
     }


    public int compareTo(Student compares) {
        int compareage=((Student)compares).getAge();
        /* For Ascending order*/
        return this.age-compareage;

    }


    public String toString() {
        return "[ rollno=" + rollno + ", name=" + studentName + ", age=" + age + "]";
    }
}

ArrayListSorting.java

package arraylistexample;

import java.util.*;


public class ArrayListSorting {
    public static void main(String[] args){
        ArrayList<Student> obj=new ArrayList<Student>();
        obj.add(new Student("Peter", 27,1));
        obj.add(new Student("John",26,7));
        obj.add(new Student("Jack",21,5));

        Collections.sort(obj);

        for(Student str:obj){
            System.out.println(str);
        }
    }

}

问题是我无法理解这里的 caompareto() 方法是如何工作的。我用谷歌搜索并阅读了许多教程。但是没有弄清楚。谁能帮帮我

来自compareTo方法的Oracle docs

Compares this object with the specified object for order. Returns a negative integer, zero, or a positive integer as this object is less than, equal to, or greater than the specified object.

当您为自己的复合对象实现该方法时,您就是在创建一种比较这些对象的方法。

例如:

一个名为 "Peter" 的 Student 和一个名为 "Greg" 的 Student - bigger/smaller 是谁?

这由您决定...您可以选择按姓名字母顺序、年龄或任何其他 component/member/logic 来决定。

编辑: 正如 Eran 在评论中提到的,Collections.sort 的工作方式是使用 compareTo 方法。来自 docs:

orts the specified list into ascending order, according to the natural ordering of its elements. All elements in the list must implement the Comparable interface. Furthermore, all elements in the list must be mutually comparable (that is, e1.compareTo(e2) must not throw a ClassCastException for any elements e1 and e2 in the list).

How compareTo works

如果被比较的两个元素 (a,b) 的顺序已经正确,a.compareTo(b) 将 return 的值 <= 0,因此无需发生任何事情.

如果它们的顺序不正确,return 值 > 0,表示它们必须互换。

所以在你的案例中,你的 compareTo 方法中传递的学生对象的年龄大于你的参考对象(这个)学生年龄,他们被交换为默认的升序排序。

为了对集合进行排序,使用 compareTo 函数来查看 object1 是否大于或小于 object2

object1.compareTo(object2)

根据 Intger 对象的 compareTo 文档

the value 0 if this Integer is equal to the argument Integer; a value less than 0 if this Integer is numerically less than the argument Integer; and a value greater than 0 if this Integer is numerically greater than the argument Integer (signed comparison).

您可以找到有关字符串对象的类似文档。这种相同的做法通常用于所有对象。

所以,想法是 class 中的 compareTo 方法基本上应该 return

  1. <0 如果 object1 < object2
  2. =0 如果 object1 = object2
  3. >0 如果 object1 > object2

使用此集合 API 可以对对象进行排序。


所以,在你的情况下你可以看到

public int compareTo(Student compares) {
    int compareage=((Student)compares).getAge();
    /* For Ascending order*/
    return this.age-compareage;

}

用于允许根据年龄比较学生的地方。

为您的 class 编写一个 compareTo 方法可以让您指定您的程序将使用什么标准来决定 class 的两个对象中的哪一个应该按顺序排在第一位。

如果你不为你的class写一个compareTo方法,那么你的程序就没有办法知道两个对象的放置顺序在 - 因此它无法对大量对象进行排序。

但是如果你在你的class中写了一个compareTo方法,并且表明你的class实现了Comparable接口,那么你的程序将能够排序class.

的任意数量的对象

这意味着您必须决定 Student 对象的显示顺序。也许您希望它们按卷号排序。所以你相应地写你的compareTo,像这样。

public int compareTo(Student other) {
    return rollno - other.rollno;
}

此特定方法将 return

  • 如果当前学生的卷号高于称为 other
  • 的学生,则为正数
  • 如果当前学生的卷号低于称为 other 的学生,则为负数。
  • 如果您尝试将学生与自己进行比较,则为零。

所以它满足了compareTo方法必须满足的所有标准;它可以用来对一群学生进行分类。用于排序的实际算法隐藏在 Collections.sort 方法中。您不需要知道它是什么 - 您只需要知道它在进行排序的过程中使用了您的 compareTo 方法。