• Java中list集合自定义排序-2022新项目


    一、业务场景

      为了加快首页数据查询的效率,因此将首页查询的数据大多数都放在了缓存中,包括各种list集合数据。对这些

    从缓存中获取的数据做了一个兜底处理,如果从缓存中没有获取到数据,则直接从数据库中去查询获取数据,然后

    在对查询到的数据做进一步的处理。从缓存中获取的数据都已经做排序处理了,可是对查询的数据如何进行排序处理呢?

    二、需求分析

      这里查询的时候,数据量不多,全国范围内的数据加起来估计也就几千条,因此是按照一定的条件进行全量查询,获取

    到数据后在进行过滤,然后是按照指定的要求进行排序。业务需求可能会按照多种方式进行排序,而且有可能是降序或者是

    升序,因此排序方式还不能写死。那自己能想到的办法有java8中的stream流排序,其次就是list集合自带的排序接口sort.

    三、解决方案

      自己私下里做了简单的测试,两种方式都可以进行排序,不过为了简化代码的操作,考虑使用list集合自带的排序接口来

    进行排序。首先看对于这个自带接口的说明,

     

    排序接口是传一个比较器,然后集合底层会自动的进行排序。

     

     

     先做一个简单的测试,从结果来看,默认是升序排序,按照年龄从小到大的排序。如果想降序的话怎么处理呢?很简单,调用一个方法reversed()即可。

    结果如图,符合预期.

    问题来了,如何想要先按照年龄排序,然后在按照生日排序怎么处理呢?

    代码如下:

    public class UserSortTest {
        public static void main(String[] args) throws ParseException {
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            List users = new ArrayList<>();
            User user1 = new User();
            user1.setAge(20);
            Date date1 = sdf.parse("2020-12-06 12:26:10");
            user1.setBirthday(date1);
            users.add(user1);
            User user2 = new User();
            user2.setAge(20);
            Date date2 = sdf.parse("2008-12-06 20:30:26");
            user2.setBirthday(date2);
            users.add(user2);
            users.sort(Comparator.comparing(User::getAge).thenComparing(User::getBirthday));
            for (User user : users) {
                System.out.println("user--->" + user.toString());
            }
        }
    }

    这是先按照岁数升序,然后在是按照生日升序排序的结果,如果按照生日降序排序,则就需要改变一下代码,如下:

    users.sort(Comparator.comparing(User::getAge).thenComparing(Comparator.comparing(User::getBirthday).reversed()));

    在比较器中在传入一个比较器,这样就可以解决问题,测试结果如下.

    继续如果有一个参数为null会报异常,这种情况如何处理呢?

    比较器排序中也做了响应的处理,处理方式如下:

    users.sort(Comparator.comparing(User::getAge).thenComparing(User::getBirthday,Comparator.nullsLast(Date::compareTo)));

    这行代码的含义是将为null值的数据排在最后面,测试结果如下.

    上面的方式学会了,如果还有第三种排序方式,则继续在后面添加方法即可,

    这段代码的含义是:首先按照年龄升序排序,然后按照出生日期升序排序,出生日期为null的排在后面,最后按照用户名称升序排序。

    学会了这几种排序方式之后,自己就可以在代码中进行任意组合,来达到自己对于排序的要求,很好的完成业务需求。有其他建议的

    小伙伴,欢迎留言讨论。

  • 相关阅读:
    Python:实现factorial iterative阶乘迭代算法(附完整源码)
    C++设计模式-创建型设计模式:构建者(Builder)
    redis + lua实现分布式接口限流实现方案
    红队内网攻防渗透:内网渗透之内网对抗:隧道技术篇&防火墙组策略&ICMP&DNS&SMB协议&出网判断&C2上线&解决方案
    Spring Data JPA 之 DataSource 详解及其加载过程
    【ArcGIS Pro二次开发】(73):使用NPOI库操作Excel
    upload-labs(1-17关攻略详解)
    【知识总结】开发提效50%的Javascript常用函数
    【接口测试】Postman(三)-变量与集合
    rosnode ping指令
  • 原文地址:https://www.cnblogs.com/yilangcode/p/16582642.html