• list集合自定义排序


    一、基本类型排序

    1.list中只有数字或字符串

    1. //升序排序 List<T> ,T为数字或字符串
    2. Collections.sort(list);
    3. //降序排序
    4. Collections.sort(list,Collections.reverseOrder());

    2.list中为对象

    基于jdk.18

    1. import lombok.Data;
    2. @Data
    3. public class User {
    4. private int id;
    5. private int age;
    6. private String name;
    7. public User(int id, int age, String name) {
    8. this.id = id;
    9. this.name = name;
    10. this.age = age;
    11. }
    12. }

    2.1 使用Comparator排序 

    Comparator 是类外部的比较器。使用此可构造一个可拓展的工具,无需修改原类。实现方法有两种:

    2.1.1新建Compartor比较器
    1. import java.util.ArrayList;
    2. import java.util.Collections;
    3. import java.util.Comparator;
    4. import java.util.List;
    5. public class SortTest {
    6. public static void main(String[] args) {
    7. // 初始化数据
    8. List list = new ArrayList() {{
    9. add(new User(1, 43, "北京"));
    10. add(new User(2, 16, "天津"));
    11. add(new User(3, 33, "石家庄"));
    12. add(new User(4, 27, "深圳"));
    13. }};
    14. // 使用 Comparator 比较器排序
    15. Collections.sort(list, new UserComparator());
    16. // 打印 list 集合
    17. list.forEach(p -> {System.out.println(p);});
    18. }
    19. }
    20. /**
    21. * 构建User比较器
    22. */
    23. class UserComparator implements Comparator {
    24. @Override
    25. //正数排前
    26. public int compare(User p1, User p2) {
    27. return p1.getAge() - p2.getAge();
    28. }
    29. }

    结果如下图所示:

     

     2.1.2匿名类比较器

     比较器Comparator可以使用匿名类的方式,更加简洁的实现排序,代码如下:

    1. import java.util.ArrayList;
    2. import java.util.Collections;
    3. import java.util.Comparator;
    4. import java.util.List;
    5. public class SortTest {
    6. public static void main(String[] args) {
    7. // 初始化数据
    8. List list = new ArrayList() {{
    9. add(new User(1, 43, "北京"));
    10. add(new User(2, 16, "天津"));
    11. add(new User(3, 33, "石家庄"));
    12. add(new User(4, 27, "深圳"));
    13. }};
    14. // 使用 Comparator 的匿名内部类 比较器排序
    15. Collections.sort(list, new Comparator(){
    16. @Override
    17. //倒数排前
    18. public int compare(User p1, User p2) {
    19. return p2.getAge() - p1.getAge();
    20. }
    21. });
    22. // 打印 list 集合
    23. list.forEach(p -> {System.out.println(p);});
    24. }
    25. }

    结果如下图所示 

     2.1.3 静态内部类
    1. //按照List中对象的id属性升序,默认升序
    2. list.sort(Comparator.comparing(User::getId));
    3. //按照List中对象的id属性降序
    4. list.sort(Comparator.comparing(User::getId).reversed());
    5. //多条件升序
    6. list.sort(Comparator.comparing(User::getId).thenComparing(User::getAge));
    7. //首先按id对对象进行排序,如果id相同,则按age进行排序
    8. list.sort(Comparator.comparing(User::getId).reversed().thenComparing(User::getAge).reversed());

    2.2 使用Comparable排序

    Comparable 是类内部的比较方法,需要修改比较类的内部方法,实现如下:

    1. import lombok.Data;
    2. @Data
    3. public class User implements Comparable{
    4. private int id;
    5. private int age;
    6. private String name;
    7. public User(int id, int age, String name) {
    8. this.id = id;
    9. this.name = name;
    10. this.age = age;
    11. }
    12. @Override
    13. public int compareTo(User user) {
    14. return user.getAge() - this.getAge();
    15. }
    16. }
    1. import java.util.ArrayList;
    2. import java.util.Collections;
    3. import java.util.List;
    4. public class SortTest {
    5. public static void main(String[] args) {
    6. // 初始化数据
    7. List list = new ArrayList() {{
    8. add(new User(1, 43, "北京"));
    9. add(new User(5, 16, "天津"));
    10. add(new User(3, 33, "石家庄"));
    11. add(new User(4, 27, "深圳"));
    12. }};
    13. // 使用Comparable进行排序
    14. Collections.sort(list);
    15. list.forEach(p -> {System.out.println(p);});
    16. }
    17. }

     结果如下图所示:

    3.使用Stream流排序

    3.1 stream的升序降序

    1. import java.util.ArrayList;
    2. import java.util.Comparator;
    3. import java.util.List;
    4. import java.util.stream.Collectors;
    5. public class SortTest {
    6. public static void main(String[] args) {
    7. // 初始化数据
    8. List list = new ArrayList() {{
    9. add(new User(1, 43, "北京"));
    10. add(new User(5, 16, "天津"));
    11. add(new User(3, 33, "石家庄"));
    12. add(new User(4, 27, "深圳"));
    13. }};
    14. // 使用Stream排序,默认升序,使用reversed为降序
    15. list = list.stream().sorted(Comparator.comparing(User::getAge).reversed()).collect(Collectors.toList());
    16. list.forEach(p -> System.out.println(p));
    17. }
    18. }

    3.2 stream中的组合排序

    1. // 使用Stream排序的组合排序,使用age降序,再使用id升序
    2. list = list.stream().sorted(Comparator.comparing(User::getAge).reversed().thenComparing(User::getId)).collect(Collectors.toList());

     

    3.3 stream中null的处理

    若类中有null的情况,可用nullsFirst或nullsLast等方法进行处理(将User类中的int类型修改为了Integer,int类型不允许为null,默认为0),代码示例如下

    1. import lombok.Data;
    2. @Data
    3. public class User{
    4. private Integer id;
    5. private Integer age;
    6. private String name;
    7. public User(Integer id, Integer age, String name) {
    8. this.id = id;
    9. this.name = name;
    10. this.age = age;
    11. }
    12. }
    1. import java.util.ArrayList;
    2. import java.util.Comparator;
    3. import java.util.List;
    4. import java.util.stream.Collectors;
    5. public class SortTest {
    6. public static void main(String[] args) {
    7. // 初始化数据
    8. List list = new ArrayList() {{
    9. add(new User(1, 43, "北京"));
    10. add(new User(5, 16, "天津"));
    11. add(new User(3, 33, "石家庄"));
    12. add(new User(4, null, "深圳"));
    13. }};
    14. // 使用Stream排序,默认升序,使用reversed为降序,nullsXXX处理null的情况
    15. list = list.stream().sorted(Comparator.comparing(User::getAge,
    16. Comparator.nullsFirst(Integer::compareTo)))
    17. .collect(Collectors.toList());
    18. list.forEach(p -> System.out.println(p));
    19. }
    20. }

    结果如下所示:

  • 相关阅读:
    Spring和junit整合_java培训
    Win11右键恢复Win10老版本
    【VSCode】快捷键+配置代码片段
    【Linux】进程
    java计算机毕业设计化妆品销售网站源码+mysql数据库+系统+lw文档+部署
    ARM 版 OpenEuler 22.03 部署 KubeSphere v3.4.0 不完全指南
    【100个 Unity实用技能】| C#中 Add 和 AddRange 的区别 及 使用示例
    【算法设计与分析 李春葆】计算几何(一)
    Java 面试题 (一) --------- Java 基础
    公务员备考(二十四) 申论强化
  • 原文地址:https://blog.csdn.net/wangyunzhao007/article/details/121078773