美文网首页
对Comparator的简单看法

对Comparator的简单看法

作者: 黄二的NPE | 来源:发表于2018-06-03 15:39 被阅读17次

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

    • Comparator

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

        public static void main(String[] args) {
            List<Cat> list = new ArrayList<>(Arrays.asList( new Cat("two", 17), new Cat("three", 15), new Cat("four", 16)));
            Collections.sort(list, new Comparator<Cat>() {
                @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<Cat>{
        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<Cat> 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的简单看法

          本文链接:https://www.haomeiwen.com/subject/bksjsftx.html