当我们实例化了大量的学生对象,此时需要对学生对象进行排序,我们可以定义一个学生类型的数组,并将顺序存储进入数组中。我们知道Java有定义一个冒泡排序的方法sort(),我们能否直接通过该方法进行对学生对象的排序呢?
import java.util.Arrays;
class Student {
public Student(String name, int age) {
this.name = name;
this.age = age;
}
String name;
int age;
}
public class Test {
public static void main(String[] args) {
Student student1=new Student("zhangan",12);
Student student2=new Student("liangan",28);
Student student3=new Student("kaugan",17);
Student[]students=new Student[3];
students[0]=student1;
students[1]=student2;
students[2]=student3;
for(Student student:students)
{
System.out.println(student);
}
Arrays.sort(students);
for(Student student:students)
{
System.out.println(student);
}
}
}
我们可以发现,直接编译报错了
在调用sort()方法时,该方法底层会调用compareTo()方法进行比较,而compareTo()方法是在Comparable接口底下的方法,我们当前都没有实现Comparabe<>接口,怎么能够强制转化为Comparable类型?因此我们需要在学生类当中实现Comparable。
此时我们实现了Comparable,后面的代表泛型,证明比较的是Student这个类,此时还需要重写compareTo()方法,赋予比较规则。此时我们可以设定比较的规则,是按照姓名来比较还是按照成绩高低来比较,比如我们设定年龄来比较
我们可以自己尝试编写sort()方法,用自己的方法实现排序过程,小小冒泡。
public static void bubble(Student[] student){
for (int i = 0; i < student.length; i++) {
for (int j = 0; j < student.length - 1 - i; j++) {
if(student[j].compareTo(student[j + 1]) > 0) {
Student tmp = student[j];
student[j] = student[j + 1];
student[j + 1] = tmp;
}
}
}
}
但是我们仔细观察,好像不是很方便,因为现在是按年龄大小低进行排序,如果明天我想要按照姓名来排序呢?直接更改代码吗?不合适当我们的代码投入使用了之后,会产生数据,如果对当前已经投入使用的代码进行更改,有可能会导致连锁反应的出现,导致出现其他的错误。那么这个时候我们可以使用sort()方法的重载方法更换底层,将sort()方法的比较方法更换为Comparetor接口底下的compare()方法
我们可以再创建另外一个类来重写另外一个规则:按照姓名来排序
public class namesort implements Comparator<Student> {
@Override
public int compare(Student o1, Student o2) {
return o1.score - o2.score;
}
}