当我们有一个学生类,我们属性有姓名,年龄,分数。我们想分别根据属性来将学生进行排序。
因为学生是引用类型,肯定不能这样比较:
if (student1 > student2){System.out.println("student1 > student2");
}
于是,我们通过接口Comparator来实现
需要将哪个类排序,就让哪个类实现接口Comparable
, T写类名然后再重写接口的compareTo(类名 o)方法
1、以按年龄排序为例:
import java.util.Arrays;
class Student implements Comparable{ //实现了Comparable接口String name;int age;double score;public Student(String name, int age, double score) {this.name = name;this.age = age;this.score = score;}@Override //重写了Comparable接口中的compareTo方法public int compareTo(Student o) {if(this.age > o.age){return 1;} else if (this.age == o.age) {return 0;}else {return -1;}}
}
public class TestDemo {public static void main(String[] args) {Student[] students = new Student[3];students[0] = new Student("小明",18,98.3);students[1] = new Student("小红",17,92.1);students[2] = new Student("小华",19,88.3);Arrays.sort(students); //实现排序System.out.println(Arrays.toString(students));}
}

也可以这样重写
@Override //重写了Comparable接口中的compareTo方法public int compareTo(Student o) {return this.age - o.age ; //从小到大排序}
2、根据分数排序
在重写方法时,因为返回值是int类型的,而分数是double类型的,需要强制转换
@Override //重写了Comparable接口中的compareTo方法public int compareTo(Student o) {return (int)(this.score - o.score) ; //因为返回值是int类型的,而分数是double类型的,需要强制转换}
3、根据姓名首字母排序
因为字母不能相减,因此需要用到String中自带的compareTo方法
@Override //重写了Comparable接口中的compareTo方法public int compareTo(Student o) {return this.name.compareTo(o.name);}
因为一个类,实现了了Comparable接口,只能有一个重写的方法,对类的侵入性太强。
可以通过比较器来实现通过不同的属性进行排序
1、语法
写一个比较器类,实现Comparator比较器接口,重写方法
年龄比较器:
class AgeComparator implements Comparator{ //年龄比较器@Overridepublic int compare(Student o1, Student o2) { //重写方法return o1.age - o2.age;}
}
分数比较器:
class ScoreComparator implements Comparator{ //分数比较器@Overridepublic int compare(Student o1, Student o2) {return (int)(o1.score - o2.score);}
}
姓名首字母比较器:
class NameComparator implements Comparator{ //姓名首字母比较器@Overridepublic int compare(Student o1, Student o2) {return o1.name.compareTo(o2.name);}
2、用法:实例化比较器类
public class TestDemo {public static void main(String[] args) {Student[] students = new Student[3];students[0] = new Student("mo",18,98.3);students[1] = new Student("ll",17,92.1);students[2] = new Student("nn",19,88.3);AgeComparator ageComparator = new AgeComparator();Arrays.sort(students,ageComparator);}
}