Comparator与Comparable比较

Comparator和Comparable比较:

参数 Comparable Comparator
排序逻辑 排序逻辑必须在待排序对象的类中,故称之为自然排序 排序逻辑在另一个实现
实现 实现Comparable接口 实现Comparator接口
排序方法 int compareTo(Object o1) int compare(Object o1,Object o2)
触发排序 Collections.sort(List) Collections.sort(List, Comparator)
接口所在包 java.lang.Comparable java.util.Comparator
Comparable接口:
  • Comparable接口可以认为是一个内部比较器;
  • 该接口对每个实现它的类的对象强加了排序规则,该排序称为自然排序,方法public int compareTo(T o)是自然排序的排序方法;
  • 如果开发者add进入一个Collection的对象想要Collections的sort方法帮你自动进行排序的话,那么这个对象必须实现Comparable接口。compareTo方法的返回值是int,有三种情况:
    1、比较者大于被比较者(也就是compareTo方法里面的对象),那么返回正整数
    2、比较者等于被比较者,那么返回0
    3、比较者小于被比较者,那么返回负整数
  • 实现Comparable接口的实体:实例Person以姓名升序排序,若姓名一样则按照年龄排序
public class Person  implements Comparable {
    private String name;
    private Integer age;
    private String mind;
    //省略getter 和 setter方法、构造函数、toString函数
    @Override
    public int compareTo(Object o) {
        Person targetPerson = (Person)o;
        int ret = this.name.compareTo(targetPerson.getName());
        if(ret == 0){
            return Integer.compare(this.age,targetPerson.getAge());
        }
        if(ret == 0){
            return this.getMind().compareTo(targetPerson.getMind());
        }
        return ret;
    }
}
Comparator接口:
  • Comparator可以认为是是一个外比较器;
  • JDK的大量的类包括常见的 String、Byte、Char、Date等都实现了Comparable接口;
  • Comparator接口里面有一个compare方法,方法有两个参数T o1和T o2,是泛型的表示方式,分别表示待比较的两个对象,方法返回值和Comparable接口一样是int,有三种情况:
    1、o1大于o2,返回正整数
    2、o1等于o2,返回0
    3、o1小于o2,返回负整数
  • 实现Comparator接口的实体:实例Person以姓名升序排序,若姓名一样则按照年龄排序
public class PersonComparator implements Comparator {
    @Override
    public int compare(Person p1, Person p2) {
        //使用到了Person类中的compareTo方法进行比较
        //若Person没实现Comparable接口,也可以自行比较
        int ret = p1.getName().compareTo(p2.getName());
        if(ret == 0){
            return p1.getAge().compareTo(p2.getAge());
        }
        return ret;
    }
}

测试比较:

public class Test {
    public static void main(String[] args){
        //生成数据
        List personList1 = generatePersonList();
        List personList2 = generatePersonList();
        //排序一:
        Collections.sort(personList1);
        print("Collections.sort(list)",personList1);
        //排序二
        PersonComparator pc = new PersonComparator();
        //PersonComparator2 pc2 = new PersonComparator2();
        Collections.sort(personList2,pc.thenComparing(pc));
        print("thenComparing",personList2);
    }

    //生成待排序数组
    private static List generatePersonList() {
        List retList = new ArrayList<>(16);
        retList.addAll(
                Arrays.asList(
                        new Person[]{
                                new Person("erMaZi", 19, "good"),
                                new Person("wangWu", 18, "middle"),
                                new Person("liSi", 17, "bad"),
                                new Person("wangWu", 16, "middla"),
                        }
                )
        );
        return retList;
    }
    public static void print(String message,List personList){
        System.out.println(message+":");
        for(Person p:personList){
            System.out.println(p);
        }
        System.out.println();
    }
}
jdk官方默认排序:
  • 升序
< return -1
= return 0
> return 1
  • 降序
< return 1
= return 0
> return -1

你可能感兴趣的:(Comparator与Comparable比较)