List根据集合内对象的某个属性进行排序(选择器)

本文介绍Java中List排序的方法,包括基本类型、字符串及对象的排序方式。详细解释了使用Collections.sort和Comparator.comparing进行升序、降序及多条件排序的具体操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

list中只有数字或者字符串

 Collections.sort(list);
 //逆序排序
 Collections.sort(list,Collections.reverseOrder());

String类型的排序,先排数字,再排字母,默认排序方式是升序

list中存放对象

在Jdk1.8之后可以用此方法,

//按照List中对象的id属性升序

list.sort(Comparator.comparing(Stu::getId))

//按照List中对象的id属性降序

list.sort(Comparator.comparing(Stu::getId).reversed());

//多条件升序

list.sort(Comparator.comparing(Stu::getId).thenComparing(Stu::getSid));

//id降序
list.sort(Comparator.comparing(Stu::getId).reversed().thenComparing(Stu::getSid))

list.sort(Comparator.comparing(Stu::getId).reversed().thenComparing(Stu::getSid))
list.sort(Comparator.comparing(Stu::getId).thenComparing(Stu::getSid).reversed());

这两者是否有区别?
多条件排序后,会不会把原有的实体类拆分再排序。

        Stu stu1 = new Stu(1,5,"张一");
        Stu stu2 = new Stu(2,4,"张二");
        Stu stu3 = new Stu(3,3,"张三");
        Stu stu4= new Stu(4,2,"张四");
        Stu stu5 = new Stu(5,1,"张五");

        List<Stu> list = new ArrayList<>();
        list.add(stu1);
        list.add(stu2);
        list.add(stu3);
        list.add(stu4);
        list.add(stu5);
        list.sort(Comparator.comparing(Stu::getId).thenComparing(Stu::getSid).reversed());
        list.forEach(x->{
            System.out.println(x);
        });
        
        System.out.println("================");

        list.sort(Comparator.comparing(Stu::getId).reversed().thenComparing(Stu::getSid));
        list.forEach(x->{
            System.out.println(x);
        });

控制台打印如下:可以看出都是根据id降序,这两者并没有区别,并且不会把实体类拆分。

Stu{id=5, sid=1, name=‘张五’}
Stu{id=4, sid=2, name=‘张四’}
Stu{id=3, sid=3, name=‘张三’}
Stu{id=2, sid=4, name=‘张二’}
Stu{id=1, sid=5, name=‘张一’}
================
Stu{id=5, sid=1, name=‘张五’}
Stu{id=4, sid=2, name=‘张四’}
Stu{id=3, sid=3, name=‘张三’}
Stu{id=2, sid=4, name=‘张二’}
Stu{id=1, sid=5, name=‘张一’}

Comparator.comparing源码分析

Comparator.comparing()点进去可以看到,主要是用了compareTo方法
在这里插入图片描述
点compareTo方法进去之后发现它是Comparable接口的唯一方法
compareTo的实现类有很多,我debug了一下发现,上面调用的是Intager下的compareTo方法然后又调用了compare方法:
在这里插入图片描述
可以看到如果第一个比第二个小,就返回-1,如果第一个比第二个大就返回1。

不仅仅是Int类型比较还有String类型的比较

在jdk1.8之前我们列表比较字符串通过以下方式都是调用java.lang.String下的compareTo方法,并且String也是实现了Comparable接口的compareTo方法。
在这里插入图片描述

    Collections.sort(list, new Comparator<Stu>() {
        @Override
        public int compare(Stu o1, Stu o2) {
            return o1.getName().compareTo(o2.getName());
        }
    });

点入进去可以发现就是char类型之间的相加减,如果是负数肯定是第一个参数小,如果是正数就是第二个参数小,这样一比较就可以进行排序。
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值