什么时候会用到 comparable 或者 comparator ?
对于普通的数据类型,列入int、char、String
我们都可以直接使用 '=' 进行比较
可是当我们创建了一个自定义类的时候
类对象之间可以比较吗?根据什么来比较?
这两个接口就可以帮我们实现这一种情况
一.comparable
class Student implements Comparable<Student>{
int age;
String name;
public Student(){}
public Student(int age, String name) {
this.age = age;
this.name = name;
}
@Override
public int compareTo(Student o) {
return 0;
}
}
comparable 的实现
- 让自定义类实现 Comparable 接口
- 重写 Comparable 接口当中的 compareTo 方法
- 在 compareTo 方法中根据需求来实现代码
例如根据age比较:
@Override
public int compareTo(Student o) {
if (this.age > o.age) {
return 1;
} else if (this.age == o.age) {
return 0;
} else {
return -1;
}
}
注意:
- 哪个类对象调用的compareTo方法,哪个就是 'this',
运行结果:
二.comparator(比较器)
自定义类:
class AgeCompare implements Comparator<Student> {
@Override
public int compare(Student o1, Student o2) {
return o1.age - o2.age;
}
}
通过创建一个AgeCompare类实现 Comparator<泛型>接口
并且重写当中的compare方法
比较String类型的代码可以这样写
class NameComparator implements Comparator<Student>{
@Override
public int compare(Student o1, Student o2) {
return o1.name.compareTo(o2.name);
}
直接调用String类已经实现了Comparable接口,直接调用当中的compare()方法即可
运行结果
总结两种比较:
Comparable
写法侵入性强,一旦写好,相当于该类只能通过比较某个属性来比较类对象。
comparator
比较方式灵活,类的实力想要通过不同的属性,只需要创建对应的类并实现comparator<>接口和重写compare方法即可