1. 比较器介绍
为元素提供一种比较方式,元素可以依照此方式进行大小排序。
基本类型的包装类都实现了比较器,如果不满足jdk定义的比较方式,可自己实现一个外比较器,指定对象的比较规则。比较时,优先使用外比较器。
2. 内比较器:Comparable - compareTo方法
若一个类实现了Comparable接口,则该类支持排序。
通过a.compareTo(b)来比较a和b的大小。如果返回正数,则a>b;如果返回负数,则a<b;如果返回零,则a=b。
内比较器定义
public interface Comparable<T> {
public int compareTo(T o);
}
实现Comparable接口,重写compareTo方法。
//内比较器
class People implements Comparable<People>{
String name;
int age;
public People(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public int compareTo(People o) {
return age - o.age;
}
@Override
public String toString() {
return "People{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
3. 外比较器:Comparator - compare方法
如果需要控制某个类的次序,可以建立一个该类的比较器来进行排序。或者不满足现在的比较方式。
若一个类实现了Comparator接口,则它一定要实现compare(T o1,T o2)函数,可以不实现equals()函数,因为任何类都有默认的equals比较方法。
通过int compare(T o1,T o2)来比较o1和o2的大小。如果返回正数,则o1>o2;如果返回负数,则o1<o2;如果返回零,则o1=o2。
定义
public interface Comparator<T> {
int compare(T o1, T o2);
boolean equals(Object obj);
}
定义一个类继承Comparator接口,实现compare方法。
//外比较器
class nameCom implements Comparator<People>{
@Override
public int compare(People o1, People o2) {
return o1.name.compareTo(o2.name);
}
}
调用外比较器的方法
//new一个外部器对象,将外比较器传值给treeMap
nameCom com = new nameCom();
TreeMap<People,String> treeMap = new TreeMap<>(com);
4. 使用场景
(1)外比较器使用场景:
如果要给对象提供多个比较原则时,可以使用外比较器;如果使用类的内部比较器不符合我们的需求,但我们没办法修改内部比价器,可以重新定义一个外比较器。
(2)内比较器使用场景:
创建类的时候,如果已经确定比较方式之后可以直接通过内比较器进行指定比价方式。