Comparator比较器
Comparator属于一种挽救的比较器支持,其主要目的是解决一些没有使用Comparable排序的类的对象的排序操作。
范例:程序项目已经开发完成了,并且由于先期的设计并没有去考虑到比较器功能
class Person{
private String name;
private int age;
public Person(String name,int age) {
this.name = name;
this.age = age;
}
//setter、getter略
public String toString() {
return "【Person类对象】姓名:"+this.name +"、年龄:"+this.age+"\n";
}
}
后来经过了若干版本的迭代更新后发现需要对Person类进行排序处理,但是又不能修改Person类(无法实现Comparable接口),所以这是就需要采用一种挽救的形式来实现比较,在Arrays类里面排序有另外一种实现:
- 基于Comparator的排序处理:public static <T> sort(T[] a ,Comparator <? super T> c)
在java.util.Compatator里面最初之定义有一个排序的compare()方法(public int compare(T o1,T o2)),但是后来持续发展又出现了许多的static方法。
范例:基于Comparator实现排序处理
class Person{
private String name;
private int age;
public Person(String name,int age) {
this.name = name;
this.age = age;
}
public void setName(String name) {
this.name = name;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return this.name;
}
public int getAge() {
return this.age;
}
public String toString() {
return "【Person类对象】姓名:"+this.name +"、年龄:"+this.age+"\n";
}
}
class PersonComparator implements Comparator<Person>{
@Override
public int compare(Person o1, Person o2) {
return o1.getAge() - o2.getAge(); //当前数据与小于传入的对象返回负数,大于返回整数,等于返回0
}
}
在测试类进行排序处理的时候就可以利用规则实现操作。
public static void main(String[] args) {
Person[] data = new Person[] {
new Person("王五",19),
new Person("张三",80),
new Person("李四",41),
new Person("周一",50)
};
Arrays.sort(data,new PersonComparator()); //进行对象数组的排序
System.out.println(Arrays.toString(data)); //输出
}
[【Person类对象】姓名:王五、年龄:19
, 【Person类对象】姓名:李四、年龄:41
, 【Person类对象】姓名:周一、年龄:50
, 【Person类对象】姓名:张三、年龄:80
]
对于这种排序的操作如果不是必须的情况下不建议使用。
面试题:请解释Comparable与Comparator的区别?
- java.lang.Comparable是在类定义的时候实现的父接口,主要用于定义排序规则,里面只有一个compareTo()方法
- java.ytil.Comparator是挽救的比较器操作,需要设置单独的比较器规则实现排序,里面有compare()方法。