目录
三、Comparable接口与Comparator接口的比较
实现了Comparable接口或Comparator接口的类的对象的列表或数组可以通过Collections.sort或Arrays.sort进行自动排序。
一、Comparable接口与compareTo()方法
compareTo()方法是写在继承comparable接口的类中的
1、使用实例
如:我们书写一个Student类,包括学号和成绩
按照学生的成绩从小到大进行排序; 如果学生的成绩相同,则按照学号的大小进行从小到大排序。
class Student implements Comparable<Student>{
int seq,grade;
public Student(int seq,int grade){
this.seq = seq;
this.grade = grade;
}
@Override
public int compareTo(Student student){
if(student.grade != this.grade){
//升序
return this.grade - student.grade;
}else{
//升序
return this.seq - student.seq;
}
}
//重写toString方法,方便类打印
@Override
public String toString(){
return this.seq + " " + this.grade;
}
}
2、compareTo()方法的升序和降序
int compareTo(T o)
比较此对象与指定对象的顺序。如果该对象小于、等于或大于指定对象,则分别返回负整数、零或正整数。
参数: o - 要比较的对象。
返回:负整数、零或正整数,根据此对象是小于、等于还是大于指定对象。
升序
public int compareTo(Student student){
return this.grade - student.grade;
}
降序
public int compareTo(Student student){
return student.grade - this.grade;
}
二、Comparator接口与compare()方法
与compareTo()方法不同,compare()方法写在要比较的类外。一种是直接实现一个Comparator类,一个是用匿名内部类或lambda表达式实现
当想要实现多个比较器时,我们就可以采用这样的Comparator接口
1、实现Comparator类
class Student {
public String name;
public int grade;
public Student(String name, int grade) {
this.name = name;
this.grade = grade;
}
public String toString(){
return this.name + " " + this.grade;
}
}
//升序比较器
class StudentComparator1 implements Comparator<Student> {
@Override
public int compare(Student student1, Student student2) {
return student1.grade - student2.grade;
}
}
//降序比较器
class StudentComparator2 implements Comparator<Student> {
@Override
public int compare(Student student1, Student student2) {
return student2.grade - student1.grade;
}
}
使用时直接创建比较器即可
if(flag == 1){
Arrays.sort(students,new StudentComparator1());
}else{
Arrays.sort(students,new StudentComparator2());
}
2、使用匿名内部类
使用匿名内部类
if(flag == 1){
//升序
Arrays.sort(students,new Comparator<Student>(){
public int compare(Student s1,Student s2){
return s1.grade - s2.grade
}
});
}else{
//降序
Arrays.sort(students,new Comparator<Student>(){
public int compare(Student s1,Student s2){
return s2.grade - s1.grade
}
});
3、使用 lambda表达式
if(flag == 1){
Arrays.sort(students,
(Student s1,Student s2) -> {return s1.grade - s2.grade}); //升序
}else{
Arrays.sort(students,
(Student s1,Student s2) -> {return s2.grade - s1.grade}); //降序
}
4、 对基本数据类型进行判断
(1)Comparator接口
注意,数组、Comparator接口传入的类型都要使用包装类,但compara()方法返回的类型要使用基本数据类型int,否则会报错
Integer[] arr = new Integer[10];
for (int i = 0; i < 10; i++) {
arr[i] = scanner.nextInt();
}
Arrays.sort(arr,new Comparator_Interger());
继承 Comparator接口
class Comparator_Interger implements Comparator<Integer>{
@Override
public int compare(Integer a,Integer b){
return b - a;
}
}
(2)使用匿名内部类
Arrays.sort(arr, new Comparator<Integer>() {
public int compare(Integer a, Integer b) {
return b - a;
}
});
三、Comparable接口与Comparator接口的比较
Comparable接口 | Comparator接口 | |
所在包 | java.lang | java.util |
优缺点 | Comparable 简单, 但是需要修改源代码,并且实用于单个比较方式 | Comparator可实现多个比较器 |