通常
comparable接口用于对同一个类的不同对象做比较
comparator接口用于对不同类的不同对象做比较
comparble接口中只有一个方法:compareTo比较方法,,用于比较当前对象和另一个对象的大小。当一个自定义类实现了comparble接口时,就必去强制重写compar To比较方法。
如图创建学生对象类,实现comparble方法,重写compar To 比较方法
注意:如果一个类实现了comparable接口,那么它就可以直接使用Collections.sort()方法进行排序
public class Student implements Comparable<Student> {
private String name;
private String age;
@Override
public int compareTo(Student o) {
// TODO Auto-generated method stub
return 0;
}
重写compar To 比较方法:
测试类
import java.util.Arrays;
import java.util.ArrayList;
public class Demo01 {
public static void main(String[] args) {
List<Student>students=new ArrayList<Student>();
students.add(new Student("a",27));
students.add(new Student("e",24));
students.add(new Student("z",25));
students.add(new Student("d",21));
Collections.sort(students);
System.out.println(students);
}
}
//输出结果
[Student [name=a, age=27], Student [name=e, age=24], Student [name=z, age=25], Student [name=d, age=21]]
以姓名属性为例进行比较,因为它是String类型,string类已经实现了comparble接口,其比较规则为。
如果认为第一个元素 > 第二个元素 返回正整数即可。
如果认为第一个元素 < 第二个元素返回负整数即可。
如果认为第一个元素 = 第二个元素返回0即可
若改用age做比较
谁调用compareTo这个方法谁就是this,o就是需要跟它比较的值。
this-o>0升序
this-o<0降序
comparator接口中有compare()方法,用于对不同类的对象进行排序,同时可以自定义比较逻辑
public class Student {
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public Student() {
}
public Student(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Student [name=" + name + ", age=" + age + "]";
}
}
import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
public class Demo01 {
public static void main(String[] args) {
List<Student>students=new ArrayList<Student>();
students.add(new Student("a",27));
students.add(new Student("e",24));
students.add(new Student("z",25));
students.add(new Student("d",21));
Collections.sort(students, new Comparator<Student>() {
@Override
public int compare(Student o1, Student o2) {
return o1.getAge() - o2.getAge();
}
});
System.out.println(students);
}
}
输出结果
[Student [name=d, age=21], Student [name=e, age=24], Student [name=z, age=25], Student [name=a, age=27]]
o1-o2升序
o2-o1降序
总结:
如果一个类实现了comparable接口,那么它就可以直接使用Collections.sort()方法进行排序;如果一个类没有实现comparable接口,但是我们仍然需要对它进行排序,那么我们可以通过实现comparator接口来定义一个比较器,然后将比较器对象传入Collections.sort()方法中进行排序。