比较器问题的引出
- 比较器指的是进行大小关系的确定判断;
- 如果要进行数组操作,肯定要使用java.util.Arrays的操作来完成,这个类里面提供有绝大部分的数组操作支持,同时在这个类里面还提供有一种对象数组的排序支持:public static void sort(Object[] a);
import java.util.Arrays;
public class SortApi {
public static void main(String[] args) throws Exception {
Integer[] data = new Integer[]{2, 4, 1, 23, 13};
Arrays.sort(data);
System.out.println(Arrays.toString(data));
}
}
- 如果给定的是一个String型的对象数组,也是可以进行排序处理的;
import java.util.Arrays;
public class SortApi {
public static void main(String[] args) throws Exception {
String[] data = new String[] {"X", "C", "U", "A", "G"};
Arrays.sort(data);
System.out.println(Arrays.toString(data));
}
}
- java.lang.Integer 与 java.lang.String 两个类都是由系统提供的程序类,如果说有一个自定义的类需要实现排序处理呢?
//采用自定义类型进行排序
import java.util.Arrays;
class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "【Person类对象】姓名:" + this.name + "、年龄:" + this.age + "\n";
}
public void setName(String name) {
this.name = name;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
}
public class SortApi {
public static void main(String[] args) throws Exception {
Person[] data = new Person[]{
new Person("张三", 18),
new Person("李四", 16),
new Person("王五", 20),
};
Arrays.sort(data);
System.out.println(data.toString());
}
}
- 上边代码运行时会报异常:Exception in thread "main" java.lang.ClassCastException: com.company.Comparer.Person cannot be cast to java.lang.Comparable,任意的一个类默认情况下是无法使用系统内部的类实现数组排序或比较需求的,是因为我们没有明确指定出到底该如何比较的定义(没有比较规则),这个时候在Java里面为了统一比较规则的定义提供了比较器的接口:Comparable 接口;
Comparable比较器
- 通过分析可以发现,如果要实现对象的比较需要有比较器来制定规则,而比较的规则可以通过Comparable来实现,对于Comparable而言,需要清楚其基本的定义结构:
public interface Comparable<T> {
/**
* @Description: 实现对象的比较处理操作
* @Param: [o要比较的对象]
* @return: int 当前数据比传入的对象小返回负数,如果大返回正数,如果等于返回0
* @Author: mars_wu
* @Date: 2020/12/29 下午3:20
*/
public int compareTo(T o);
}
class Person implements Comparable<Person> {
...
@Override
public int compareTo(Person per) {
return this.age - per.age;
}
...
}
- 排序里面需要一个compareTo()方法进行排序规则的定义,而后Java系统里面就可以为其实现排序处理了;
Comparator比较器
- Comparator 属于一种挽救的比较器支持,其主要的目的是解决一些没有使用Comparable排序的类对象的数组排序问题;
- 基于Comparator的排序处理:public static <T> void sort(T[] a, Comparator<? super T> c)
此图来源于李兴华老师
- 在java.util.Comparator里面最初只定义一个排序的compare()方法(public int compare(T o1, T o2)),但是后续又提供了很多static方法;
import java.util.Arrays;
import java.util.Comparator;
class PersonComparator implements Comparator<Person> {
@Override
public int compare(Person per1, Person per2) {
return per1.getAge() - per2.getAge();
}
}
class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "【Person类对象】姓名:" + this.name + "、年龄:" + this.age + "\n";
}
public void setName(String name) {
this.name = name;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
}
public class ComparatorApi {
public static void main(String[] args) throws Exception {
Person[] data = new Person[]{
new Person("张三", 18),
new Person("李四", 16),
new Person("王五", 20),
};
Arrays.sort(data, new PersonComparator());
System.out.println(Arrays.toString(data));
}
}