一、Compable
首先我们了解一下自然排序:
自然排序:人类对常识认知的升序排序,例如我们知道的123....,abc...等等
Comparable接口又叫内部比较器,主要用于内部元素之间的比较,我们学过的Integer以及String就是实现了这个接口的自然排序,它的抽象方法compareTo 用于自身元素比较对对象进行排序
代码示例:
创建一个people类,按照年龄从小到大升序排序
/***/
public class People implements Comparable<People> {
//姓名
private String name;
//年龄
private int age;
ublic 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;
}
public People(String name, int age) {
this.name = name;
this.age = age;
}
//按照年龄升序排序
@Override
public int compareTo(People p) {
return this.age-p.age;
}
@Override
public String toString() {
// TODO 自动生成的方法存根
return "名字:" + name +age+ "岁";
}
}
测试:
public class Test {
// 创建一个集合把元素加进去
public static List<People> list = new ArrayList<People>();
static {
list.add(new People("张三", 25));
list.add(new People("李四", 45));
list.add(new People("王五", 23));
list.add(new People("小白", 27));
list.add(new People("小红", 35));
list.add(new People("莉莉", 15));
}
public static void main(String[] args) {
//基于实现的compareTo方法排序
Collections.sort(list);
list.forEach(s -> System.out.println(s));
}
}
输出结果:
但是在实际开发中,基于Comparable实现的比较不能满足我们现有的需要,那么就需要修改这个类的比较方法compareTo,但是我们知道开闭原则,最好不要对已经交付的类进行修改,这个时候我们就需要引入外部比较器Comparator.
二、Comparator
Comparator又叫外部比较器,当内部比较器满足不了实际要求或者不存在时,就需要用Comparator来定制比较规则,通过compare方法对两个对象进行比较排序。还以上面例子再做研究,现在我们需要年龄从大到小降序排序。
代码示例
public class Test {
// 创建一个集合把元素加进去
public static List<People> list = new ArrayList<People>();
static {
list.add(new People("张三", 25));
list.add(new People("李四", 45));
list.add(new People("王五", 23));
list.add(new People("小白", 27));
list.add(new People("小红", 35));
list.add(new People("莉莉", 15));
}
public static void main(String[] args) {
//Comparator的Lambda表达式
Collections.sort(list, (p1, p2) -> p2.getAge() - p1.getAge());
list.forEach(p -> System.out.println(p));
}
}
输出结果:
(两个接口的两个方法都约定成俗,大于返回1,等于返回0,小于返回-1)