我们先给一个数组排序,我们肯定用的是Arrays.sort()方法:
public class test2 { public static void main(String[] args) { int[] arr={3,5,4,6,9,8,1}; System.out.println(Arrays.toString(arr)); System.out.println("---------"); Arrays.sort(arr); System.out.println(Arrays.toString(arr)); } }
这样我们就实现了对这个数组的排序。
但是我们现在又有另外一个需求:
class Student{ public String name; public int age; public int score; public Student(String name, int age, int score) { this.name = name; this.age = age; this.score = score; } } Student[] students=new Student[4]; students[0]=new Student("zhangsan",10,19); students[1]=new Student("lisi",8,78); students[2]=new Student("wangwu",15,57); students[3]=new Student("zhaoliu",11,57);
这里定义了一个Student数组,数组大小为4,也就是说数组中有4个学生,然后分别实例化了4个学生,把他们的名字年龄和成绩都输入了进去,现在我们想以年龄或成绩进行排序,那应该怎么实现呢,还是用Arrays.sort()方法吗?我们可以试一下:
当我们把这个数组进行排序时,报错了,报了一个类型转换异常。
我们进入这个第二行报的错,显示源码中第320行报错:源码中这几段代码的意思是取到数组中的某个值,把这个值转化为了一个Comparable类型(这个Comparable是一个接口),然后调用一个compareTo()方法。
可是我们现在学生类型和这个接口类型没有什么关系,所以会报错。那怎么让他可以转换呢,我们可以让这个类实现这个接口,这个接口有一个compareTo()方法,所以我们要重写这个compareTo()方法。
那么我们总结一下:实现了comparable接口的这些类,我们就可以使用Arrays.sort()来进行一个排序。如果没有实现comparable接口直接用Arrays.sort()来进行排序的话,那他是没办法帮你排序的。但是我们做了规定,如果你想排序的话,那么我们就实现comparable接口。然后再重写里面的compareTo()方法,然后在compareTo()方法里面就可以根据你自定义的一个逻辑来进行排序。
然后我们来看一下完整的代码,要求对4个学生的年龄大小进行排序:
package csdn; import java.util.Arrays; class Student implements Comparable<Student> { public String name; public int age; public int score; public Student(String name, int age, int score) { this.name = name; this.age = age; this.score = score; } @Override public String toString() { return "Student{" + "name='" + name + '\'' + ", age=" + age + ", score=" + score + '}'; } @Override public int compareTo(Student o) { //重写compareTo方法 if (this.age>o.age){ //根据年龄大小进行排序 return 9; }else if (this.age<o.age){ return -1; }else { return 0; } } } public class test { public static void main(String[] args) { Student[] students=new Student[4]; students[0]=new Student("zhangsan",10,19); students[1]=new Student("lisi",8,78); students[2]=new Student("wangwu",15,57); students[3]=new Student("zhaoliu",11,57); Arrays.sort(students); System.out.println(Arrays.toString(students)); } }
在 sort 方法中会自动调用 compareTo 方法 . compareTo 的参数是 Object , 其实传入的就是 Student 类型的对象 .
然后比较当前对象和参数对象的大小关系:
如果当前对象应排在参数对象之前 , 返回小于 0 的数字 ;
如果当前对象应排在参数对象之后 , 返回大于 0 的数字 ;
如果当前对象和参数对象不分先后 , 返回 0;
再次执行程序 , 结果就符合预期了 .
这里输出的结果就是按照学生年龄的大小来排序的。