对Comparator的简单看法

Java中要对列表或者数组自定义排序,有两种方法,一种是实现Comparator的方法,另一种是实现Comparable接口,然后重写compareTo方法

  • Comparator

假如现在有一个装了Cat的list,Cat有name和age的属性,现在要把Cat按name的长度倒序:

    public static void main(String[] args) {
        List list = new ArrayList<>(Arrays.asList( new Cat("two", 17), new Cat("three", 15), new Cat("four", 16)));
        Collections.sort(list, new Comparator() {
            @Override
            public int compare(Cat cat1, Cat cat2) {
                return cat2.getName().length() - cat1.getName().length();
            }
        });
        list.forEach((Cat c) -> System.out.println(c.getName()+ ":" + c.getAge()));
    }

在compare的方法中,有时候会不明白到底什么时候是正序,什么时候是倒序,有个小小的规律可以参考一下:

  1. 当 compare方法 返回 > 0的时候, 表示cat1 排在 cat2 后面 ;
  2. 当 compare方法 返回 < 0 的时候, 表示cat1 排在 cat2 前面;
  3. 当 compare 方法 返回 0 的时候, 表示cat1 和 cat2 位置不变;
    或者你可以直接理解为当 cat1 -cat2 的时候是正序,cat2 - cat1为倒序

在上面的代码中, 假如cat1.name = "two",长度为3, cat2.name = "three", 长度为5, 因为 cat2.getName().length() - cat1.getName().length() > 0, 所以 cat1 排在 cat2的后面,也就是说name的长度越短的排在后面,所以这是按name长度倒序

  • Comparable

假如用实现Comparable接口的方法

public class Cat implements Comparable{
    private String name;
    private Integer age;
    ...
    @Override
    public int compareTo(Cat o) {
        return o.getName().length() - this.getName().length();
    }
}

public static void main(String[] args) {
    List list = new ArrayList<>(Arrays.asList(new Cat("two", 17), new Cat("three", 15), new Cat("four", 16)));
    Collections.sort(list);
    list.forEach((Cat c) -> System.out.println(c.getName() + ":" + c.getAge())); 
}

我们可以把compareTo中的this对象对应Comparator的cat1对象,o对应Comparator的cat2.其他规律如Comparator.

你可能感兴趣的:(对Comparator的简单看法)