java中集合排序的常用方法总结

简介: 平常的开发需求中肯定会遇到对集合排序问题,最常见的排序是在持久层中使用sql进行排序,但是由于业务限制或是其他原因,不能在持久层进行排序处理只能在逻辑层处理,那今天就来聊一下如何在逻辑层,不借助持久层进行集合的排序处理.

前言


   平常的开发需求中肯定会遇到对集合排序问题,最常见的排序是在持久层中使用sql进行排序,但是由于业务限制或是其他原因,不能在持久层进行排序处理只能在逻辑层处理,那今天就来聊一下如何在逻辑层,不借助持久层进行集合的排序处理.

   集合中进行排序的核心比较器是Comparable或是Comparator,两个接口中都需要实现比较的方法进而进行排序处理,下文按照最常用的Comparator进行说明.

   梳理平常的业务处理类型,需要排序的集合元素主体最常见的无非就是两种,一种是数字,一种是对象类型.下面按照根据不同的元素类型进行介绍排序方式.


1.集合元素为数字

ArrayList<Integer> list = new ArrayList<>();
        list.add(29);
        list.add(5);
        list.add(9);
        list.add(25);
        // 1.Collections.sort方法,默认升序排列  Collections为java.util.Collections导入.底层源码是Comparator
        Collections.sort(list); 
        System.out.println(list); // 输出内容:[5, 9, 25, 29]
        // 2.集合自带的sort方法,默认升序,参数需要传递Comparator
        list.sort((a,b)->{return a.compareTo(b);});  
        System.out.println(list); // 输出内容:[5, 9, 25, 29]
        // 以上也可以简写成如下:
        list.sort(Integer::compareTo);  
        System.out.println(list); // 输出内容:[5, 9, 25, 29]
        // 如果想按照倒叙进行排列,可以修改两个形参的位置
        list.sort((a,b)->{return b.compareTo(a);});  
        System.out.println(list); // 输出内容:[5, 9, 25, 29]
        // 也可以Comparator.comparing().reversed()进行倒序排列
        list.sort(Comparator.comparing(Integer::intValue).reversed());  
        System.out.println(list); // 输出内容:[5, 9, 25, 29]


2.集合元素为对象

List<Student> studentList = Arrays.asList(
                new Student("小黄", 20),
                new Student("小花", 50),
                new Student("小李", 10)
        );
        // 默认升序
        studentList.sort(Comparator.comparing(Student::getAge));
        System.out.println(studentList);  // [Student{name='小李', age=10}, Student{name='小黄', age=20}, Student{name='小花', age=50}]
        // 调用reversed()进行降序处理
        studentList.sort(Comparator.comparing(Student::getAge).reversed());
        System.out.println(studentList);   // [Student{name='小花', age=50}, Student{name='小黄', age=20}, Student{name='小李', age=10}]


另外推荐一下stream的写法,注意jdk1.8以及以上版本可用.

List<Student> studentList = Arrays.asList(
                new Student("小黄", 20),
                new Student("小花", 50),
                new Student("小李", 10)
        );
        // 默认升序
       List<Student> studentListAfterSort = studentList.stream().sorted(Comparator.comparing(Student::getAge)).collect(Collectors.toList());
        System.out.println(studentListAfterSort);  // [Student{name='小李', age=10}, Student{name='小黄', age=20}, Student{name='小花', age=50}]
  // 调用reversed进行降序处理
        List<Student> studentListAfterSort = studentList.stream().sorted(Comparator.comparing(Student::getAge).reversed()).collect(Collectors.toList());
        System.out.println(studentListAfterSort);  // [Student{name='小花', age=50}, Student{name='小黄', age=20}, Student{name='小李', age=10}]

   stream写法在进行集合排序处理时需要注意:如果对pageHelper查询出的数据进行stream方式排序处理,会造成分页失效问题,具体内容参考:

stream排序导致pageHelper分页失效处理,

所以平常在使用时需要权衡使用哪种排序方式.

   以上是平常处理集合排序常用的几种方式,如果感觉不错或是有帮助,欢迎评论区留言或是点赞!


相关文章
|
7天前
|
Java 大数据 API
Java Stream API:现代集合处理与函数式编程
Java Stream API:现代集合处理与函数式编程
167 100
|
7天前
|
Java API 数据处理
Java Stream API:现代集合处理新方式
Java Stream API:现代集合处理新方式
160 101
|
11天前
|
存储 Java Go
对比Java学习Go——函数、集合和OOP
Go语言的函数支持声明与调用,具备多返回值、命名返回值等特性,结合`func`关键字与类型后置语法,使函数定义简洁直观。函数可作为一等公民传递、赋值或作为参数,支持匿名函数与闭包。Go通过组合与接口实现面向对象编程,结构体定义数据,方法定义行为,接口实现多态,体现了Go语言的简洁与高效设计。
|
20天前
|
算法 Java
50道java集合面试题
50道 java 集合面试题
|
1月前
|
存储 NoSQL Java
Java Stream API:集合操作与并行处理
Stream API 是 Java 8 提供的集合处理工具,通过声明式编程简化数据操作。它支持链式调用、延迟执行和并行处理,能够高效实现过滤、转换、聚合等操作,提升代码可读性和性能。
|
1月前
|
存储 缓存 安全
Java集合框架(三):Map体系与ConcurrentHashMap
本文深入解析Java中Map接口体系及其实现类,包括HashMap、ConcurrentHashMap等的工作原理与线程安全机制。内容涵盖哈希冲突解决、扩容策略、并发优化,以及不同Map实现的适用场景,助你掌握高并发编程核心技巧。
|
1月前
|
存储 缓存 安全
Java集合框架(二):Set接口与哈希表原理
本文深入解析Java中Set集合的工作原理及其实现机制,涵盖HashSet、LinkedHashSet和TreeSet三大实现类。从Set接口的特性出发,对比List理解去重机制,并详解哈希表原理、hashCode与equals方法的作用。进一步剖析HashSet的底层HashMap实现、LinkedHashSet的双向链表维护顺序特性,以及TreeSet基于红黑树的排序功能。文章还包含性能对比、自定义对象去重、集合运算实战和线程安全方案,帮助读者全面掌握Set的应用与选择策略。
144 23
|
1月前
|
存储 安全 Java
Java集合框架(一):List接口及其实现类剖析
本文深入解析Java中List集合的实现原理,涵盖ArrayList的动态数组机制、LinkedList的链表结构、Vector与Stack的线程安全性及其不推荐使用的原因,对比了不同实现的性能与适用场景,帮助开发者根据实际需求选择合适的List实现。
|
1月前
|
安全 Java 开发者
Java集合框架:详解Deque接口的栈操作方法全集
理解和掌握这些方法对于实现像浏览器后退功能这样的栈操作来说至关重要,它们能够帮助开发者编写既高效又稳定的应用程序。此外,在多线程环境中想保证线程安全,可以考虑使用ConcurrentLinkedDeque,它是Deque的线程安全版本,尽管它并未直接实现栈操作的方法,但是Deque的接口方法可以相对应地使用。
118 12
|
1月前
|
算法 Java 开发者
Java 项目实战数字华容道与石头迷阵游戏开发详解及实战方法
本文介绍了使用Java实现数字华容道和石头迷阵游戏的技术方案与应用实例,涵盖GUI界面设计、二维数组操作、游戏逻辑控制及自动解法算法(如A*),适合Java开发者学习游戏开发技巧。
191 46