比较器
所谓的比较器指的就是进行大小关系的确定判断
1、比较器问题的引出
如果要进行数组操作,肯定使用java.util.Arrays的操作类完成,这个类里面提供有绝大部分的数组操作支持,同时这个类里面还提供有一种对象数组的排序支持:public static void sort(Object[] a)
范例:实现对象数组的排序
public class JavaAPIDemo {
public static void main(String[] args) throws ParseException {
Integer data[] = new Integer[]{10, 9, 5, 2, 20}; //对象数组
Arrays.sort(data); //进行对象数组的排序
System.out.println(Arrays.toString(data));
}
}
如果说现在给定一个是String类型的对象数组。那么也是可以进行排序处理的
范例:String对象数组排序
public class JavaAPIDemo {
public static void main(String[] args) throws ParseException {
String data[] = new String[]{"X", "B", "F", "A", "G"}; //对象数组
Arrays.sort(data);
System.out.println(Arrays.toString(data));
}
}
//结果:[A, B, F, G, X]
java.lang.Integer与java.lang.String两个类都是由系统提供的程序类。那么有一个自定义的类需要实现排序处理呢
范例:采用自定义类型进行排序
class Person{
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
//setter getter略
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
public class JavaAPIDemo {
public static void main(String[] args) throws ParseException {
Person person [] = new Person []{
new Person("A" , 80),
new Person("B" , 60),
new Person("C" , 100),
};
Arrays.sort(person);
System.out.println(Arrays.toString(person));
}
}
结果产生了运行时异常:
class cn.mldn.demo.Person cannot be cast to class java.lang.Comparable
任意的一个类默认情况下是无法使用系统内部的类进行数组排序或比较需求的,是因为没有明确的指定出到底该如何比较的定义(没有比较规则),那么这个时候在Java里面为了统一比较的规则的定义,所以提供有比较器的接口:Comparable接口
2、Comparable比较器
通过分析可以发现如果要实现对象的比较肯定需要有比较器来制定比较规则,而比较的规则可以通过Comparable来实现。对于Comparable而言,需要清楚基本的定义结构:
interface ComParameter<T>{
/**
* 实现对象的比较处理操作
* @param o 要比较的对象
* @return 当前数据比传入的对象小返回负数,如果大返回正数,等于返回0
*/
public int compareTo(T o);
}
范例:实现自定义对象数组排序
class Person implements Comparable<Person>{
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
//setter getter略
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
@Override
public int compareTo(Person o) {
return age - o.age;
}
}
public class JavaAPIDemo {
public static void main(String[] args) throws ParseException {
Person person [] = new Person []{
new Person("A" , 80),
new Person("B" , 60),
new Person("C" , 100),
};
Arrays.sort(person);
System.out.println(Arrays.toString(person));
}
}
排序里面只需要有一个compareTo()的方法进行排序规则的定义,而后整个Java系统里面就可以为其实现排序处理了
3、Comparator比较器
Comparator属于一种挽救的比较器支持,其主要的目的是解决一些没有使用Comprarable数组排序
范例:现在程序项目已经开发完成了,并且由于先期的设计没有去考虑到所谓的比较器功能
class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
//setter getter略
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
后来经过了若干版本的迭代更新之后发现需要对Person类进行排序处理,但是又不能修改Person类(无法实现Comparable),所以这个时候就需要采用一种挽救的形式来实现比较,在Arrrays类里面排序有另外一种实现:
- 排序处理:public staic void sort(T[] a , Comparator<? super T> c)
在java.util.Comparator里面最初只定义有一个排序的compare()方法(public int compare(T o1 , T o2)),但后来持续发展又出现了许多的static的方法
范例:定义排序规则类
public class JavaAPIDemo {
public static void main(String[] args) throws ParseException {
Person[] person = new Person []{
new Person("A" , 80),
new Person("B" , 60),
new Person("C" , 100),
};
Arrays.sort(person , new PersonComparator());
System.out.println(Arrays.toString(person));
}
}
class PersonComparator implements Comparator<Person> {
@Override
public int compare(Person p1 , Person p2) {
return p1.getAge() - p2.getAge();
}
}
class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = 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;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
对于这种排序的操作如果不是必须的情况下强烈不建议使用Comparator,最好以Comparable为主
面试题:请解释Comparable与Comparator的区别
- java.lang.Comparable是在类定义的时候实现的父接口,主要用于定义排序规则,里面只有一个compareTo()的方法
- java.util.Comparator是挽救在比较器的操作,需要设置单独的比较器规则类实现排序,里面有compare()方法
下一篇:二叉树的实现