• 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. }

    结果如下所示:

  • 相关阅读:
    【计网】物理层
    DDPM(Denoising Diffusion Probabilistic Models)扩散模型简述
    基于win32实现TB登陆滑动验证
    Python数学计算工具3、Python 斐波那契数列-前500项列表
    【数据结构】——顺序表
    点云采样方法
    开源组件 | 一款好用的小程序生成图片库
    Transformer的基本原理
    vue-cli创建项目的步骤
    数据结构与算法复习:第三十三弹
  • 原文地址:https://blog.csdn.net/wangyunzhao007/article/details/121078773