一.问题的提出(给对象数组排序)
先来看以下代码
package NewOOP.prot.deepPort; import java.util.Arrays; public class Student implements Comparable { private String name; private int age; private 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 + '}'; } public static void main(String[] args) { Student[] students = new Student[] { new Student("张三", 95,60), new Student("李四", 96,68), new Student("王五", 97,54), new Student("赵六", 92,99), }; Arrays.sort(students); System.out.println(Arrays.toString(students)); } }
此代码运行会报错,原因就是使用sort方法对数组进行排序时,没有指定按照 姓名 还是年龄或者分数进行排序。
二.comparable
我们知道,上面的代码中,最主要的就是排序方法,他对我们的数组进行了排序。那么可不可以在排序方法中按照我们指定的方法进行排序呢?
package NewOOP.prot.deepPort; import java.util.Arrays; public class Student implements Comparable { private String name; private int age; private 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 + '}'; } public static void main(String[] args) { Student[] students = new Student[] { new Student("张三", 95,60), new Student("李四", 96,68), new Student("王五", 97,54), new Student("赵六", 92,99), }; Arrays.sort(students); System.out.println(Arrays.toString(students)); } @Override public int compareTo(Object o) { //重写compareTo Student s = (Student) o; //向下转型 if(this.age > s.age) { return 1; } else if (this.age < s.age) { return -1; } else { return 0; } } }
我们的Student类使用了comparable接口,重写了comparable中的compareTo方法
并且按照年龄进行了排序
我们对compareTo方法进行简单的介绍:
1. 它的参数Object是所有类的父类,使用sort方法时,Object o 接收了我们的students数组中的第一项,此时就发生了向上转型。但是如果我们要使用Student类中的属性,就需要对o进行强转,使其变成Student类型,也就是向下转型。
2.this.age 是谁调用的这个方法,而o.age是传入的参数,具体实现可以去参考compareTo的源码