Comparator排序看这篇就够了(java7与java8比较)

o1表示位于前面的对象,o2表示后面的对象,如何按照指定顺序排序呢?

java7排序:

compare方法大于0,就把前一个数和后一个数交换,如果小于等于0就保持原位置,不进行交换。

    public static void main(String[] args) {
        List<Integer> list = Arrays.asList(1, 4, 5, 8, null, 10, 9);
        System.out.println(list);
        Collections.sort(list, new Comparator<Integer>() {
            @Override
            public int compare(Integer o1, Integer o2) {
                if (o1 == null || o2 == null)
                    return -1;
                if (o1.compareTo(o2) > 0) {
                    return 1;
                } else if (o1.compareTo(o2) < 0) {
                    return -1;
                } else {
                    return 0;
                }
            }
        });
        System.out.println(list);
    }

运行结果为:

[1, 4, 5, 8, null, 10, 9]
[null, 1, 4, 5, 8, 9, 10]

我们看一下上面的compare函数,o1.compareTo(o2) > 0那么说明此时o1要大于o2,而此时return 1,我们上面说了,重载的compare返回值大于0那么就会对调,也就是将o1和o2对调,也就是小的数放在左边,大数放在右边,这就是典型的升序。

如果这里改成
 

    public static void main(String[] args) {
        List<Integer> list = Arrays.asList(1, 4, 5, 8, null, 10, 9);
        System.out.println(list);
        Collections.sort(list, new Comparator<Integer>() {
            @Override
            public int compare(Integer o1, Integer o2) {
                if (o1 == null || o2 == null)
                    return 1;
                if (o1.compareTo(o2) > 0) {
                    return -1;
                } else if (o1.compareTo(o2) < 0) {
                    return 1;
                } else {
                    return 0;
                }
            }
        });
        System.out.println(list);
    }

[1, 4, 5, 8, null, 10, 9]
[10, 9, 8, 5, 4, 1, null]

此时就是降序了,还是拿刚刚的o1.compareTo(o2) > 0来举例子,此时那么说明此时o1要大于o2,而此时return -1,我们上面说了,重载的compare返回值大于0那么就会对调,而这里小于0,所以o1和o2不用对调,大数o1在左边,小数o2在右边,这就是典型的降序。

java8排序

那java8中如何优雅的排序呢?

comparator 是一个函数式接口,对接口进行了增强(增加了相当多的默认方法)。

  1. reversed 倒叙
  2. comparing 比较器(comparingInt 、 comparingLong、comparingDouble)
  3. thenComparing 之后比较(串联比较),如果第一个比较器确定不了顺序,thenComparing 才会有效果
    public static void main(String[] args) {
        ArrayList<Student> list = new ArrayList<Student>();
        list.add(new Student(8, 80));
        list.add(new Student(7, 70));
        list.add(new Student(7, 65));

        //升序
        list.sort(Comparator.comparingInt(Student::getAge));
        //降序
        list.sort(Comparator.comparingInt(Student::getAge).reversed());
        //先以年龄降序,后以身高升序
        list.sort(Comparator.comparingInt(Student::getAge).reversed().thenComparingInt(Student::getHeight));

        list.stream().forEach(s->System.out.println(s));
    }

执行结果:

Student{age=8, height=80}
Student{age=7, height=65}
Student{age=7, height=70}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值