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

时间:2016-11-11 08:07:35

标签: java arraylist compareto

我是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()方法在这里是如何工作的。我用Google搜索并阅读了许多教程。但是没有明白的想法。任何人都可以帮助我。

4 个答案:

答案 0 :(得分:2)

来自compareTo方法的Oracle docs

  

将此对象与指定的订单对象进行比较。返回负整数,零或正整数,因为此对象小于,等于或大于指定对象。

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

例如:

Student名为&#34;彼得&#34;和#Student名为&#34; Greg&#34; - 谁更大/更小?

由您决定......您可以选择按字母顺序排列的名称,年龄,或任何其他组件/成员/逻辑来决定。

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

  

根据元素的自然顺序,将指定列表按升序排序。列表中的所有元素都必须实现Comparable接口。此外,列表中的所有元素必须是可相互比较的(即,e1.compareTo(e2)不得对列表中的任何元素e1和e2抛出ClassCastException。)

答案 1 :(得分:1)

  

compareTo如何运作

如果被比较的两个元素(a,b)已经是正确的顺序,则a.compareTo(b)将返回一个&lt; = 0的值,因此不需要发生任何事情。

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

因此,在你的情况下,在compareTo方法中传递的学生对象的年龄大于你的参考对象(这个)学生年龄,他们可以互换为提升的默认排序。

答案 2 :(得分:0)

对于排序集合,compareTo函数用于通过执行

来查看object1是否大于或小于object2
object1.compareTo(object2)

根据Intger Object的compareTo

的文档
  

如果此Integer等于参数Integer,则值为0;一个值   如果此Integer在数值上小于参数,则小于0   整数;如果此Integer在数字上,则值大于0   大于参数Integer(签名比较)。

您可以找到String Object的类似文档。这种做法通常用于所有对象。

所以,我们的想法是你的类中的compareTo方法基本上应该返回

    如果<0 object1 < ,则
  1. object2 如果=0 object1 =
  2. ,则
  3. object2 如果>0 object1 >
  4. ,则
  5. object2

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

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

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

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

答案 3 :(得分:0)

为您的类编写compareTo方法,可以指定程序将使用哪些条件来确定该类中的哪两个对象应该按顺序排在第一位。

如果您没有为您的班级编写compareTo方法,那么您的程序无法知道将两个对象放入哪个订单 - 因此它没有排序大量物体的方法。

但是如果你在类中编写compareTo方法,并且表明你的类实现了Comparable接口,那么你的程序将能够对该类的任意数量的对象进行排序。

这意味着您必须决定希望Student个对象出现的顺序。也许您希望它们按卷号排序。所以你要相应地写下你的compareTo

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

此特定方法将返回

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

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