list集合自定义排序

一、基本类型排序

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

复制代码
//升序排序 List<T> ,T为数字或字符串 
Collections.sort(list);
//降序排序
Collections.sort(list,Collections.reverseOrder());

2.list中为对象

基于jdk.18

java 复制代码
import lombok.Data;

@Data
public class User {

    private int id;
    private int age;
    private String name;
    
    public User(int id, int age, String name) {
        this.id = id;
        this.name = name;
        this.age = age;
    }

}

2.1 使用Comparator排序

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

2.1.1新建Compartor比较器
java 复制代码
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

public class SortTest {

    public static void main(String[] args) {
        // 初始化数据
        List<User> list = new ArrayList<User>() {{
            add(new User(1, 43, "北京"));
            add(new User(2, 16, "天津"));
            add(new User(3, 33, "石家庄"));
            add(new User(4, 27, "深圳"));
        }};

        // 使用 Comparator 比较器排序
        Collections.sort(list, new UserComparator());
        // 打印 list 集合
        list.forEach(p -> {System.out.println(p);});

    }
}
/**
 * 构建User比较器
 */
class UserComparator implements Comparator<User> {
    @Override
    //正数排前
    public int compare(User p1, User p2) {
        return p1.getAge() - p2.getAge();
    }
}

结果如下图所示:

2.1.2匿名类比较器

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

java 复制代码
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

public class SortTest {

    public static void main(String[] args) {
        // 初始化数据
        List<User> list = new ArrayList<User>() {{
            add(new User(1, 43, "北京"));
            add(new User(2, 16, "天津"));
            add(new User(3, 33, "石家庄"));
            add(new User(4, 27, "深圳"));
        }};

        // 使用 Comparator 的匿名内部类 比较器排序
        Collections.sort(list, new Comparator<User>(){
            @Override
            //倒数排前
            public int compare(User p1, User p2) {
                return p2.getAge() - p1.getAge();
            }
        });
        // 打印 list 集合
        list.forEach(p -> {System.out.println(p);});

    }
}

结果如下图所示

2.1.3 静态内部类
java 复制代码
        //按照List中对象的id属性升序,默认升序
        list.sort(Comparator.comparing(User::getId));

        //按照List中对象的id属性降序
        list.sort(Comparator.comparing(User::getId).reversed());

        //多条件升序
        list.sort(Comparator.comparing(User::getId).thenComparing(User::getAge));

        //首先按id对对象进行排序,如果id相同,则按age进行排序
        list.sort(Comparator.comparing(User::getId).reversed().thenComparing(User::getAge).reversed());

2.2 使用Comparable排序

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

java 复制代码
import lombok.Data;

@Data
public class User implements Comparable<User>{

    private int id;
    private int age;
    private String name;

    public User(int id, int age, String name) {
        this.id = id;
        this.name = name;
        this.age = age;
    }

    @Override
    public int compareTo(User user) {
        return user.getAge() - this.getAge();
    }
}
java 复制代码
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class SortTest {

    public static void main(String[] args) {
        // 初始化数据
        List<User> list = new ArrayList<User>() {{
            add(new User(1, 43, "北京"));
            add(new User(5, 16, "天津"));
            add(new User(3, 33, "石家庄"));
            add(new User(4, 27, "深圳"));
        }};

        // 使用Comparable进行排序
        Collections.sort(list);
        list.forEach(p -> {System.out.println(p);});

    }
}

结果如下图所示:

3.使用Stream流排序

3.1 stream的升序降序

java 复制代码
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.stream.Collectors;

public class SortTest {

    public static void main(String[] args) {
        // 初始化数据
        List<User> list = new ArrayList<User>() {{
            add(new User(1, 43, "北京"));
            add(new User(5, 16, "天津"));
            add(new User(3, 33, "石家庄"));
            add(new User(4, 27, "深圳"));
        }};

        // 使用Stream排序,默认升序,使用reversed为降序
        list = list.stream().sorted(Comparator.comparing(User::getAge).reversed()).collect(Collectors.toList());

        list.forEach(p -> System.out.println(p));

    }
}

3.2 stream中的组合排序

java 复制代码
        // 使用Stream排序的组合排序,使用age降序,再使用id升序
        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),代码示例如下

java 复制代码
import lombok.Data;

@Data
public class User{

    private Integer id;
    private Integer age;
    private String name;

    public User(Integer id, Integer age, String name) {
        this.id = id;
        this.name = name;
        this.age = age;
    }
}
java 复制代码
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.stream.Collectors;

public class SortTest {

    public static void main(String[] args) {
        // 初始化数据
        List<User> list = new ArrayList<User>() {{
            add(new User(1, 43, "北京"));
            add(new User(5, 16, "天津"));
            add(new User(3, 33, "石家庄"));
            add(new User(4, null, "深圳"));
        }};

        // 使用Stream排序,默认升序,使用reversed为降序,nullsXXX处理null的情况
        list = list.stream().sorted(Comparator.comparing(User::getAge,
                        Comparator.nullsFirst(Integer::compareTo)))
                .collect(Collectors.toList());
        list.forEach(p -> System.out.println(p));

    }
}

结果如下所示:

相关推荐
身如柳絮随风扬37 分钟前
多数据源切换实战:从业务场景到3种实现方案全解析
java·分布式·微服务
Java小生不才1 小时前
Spring AI文生音
java·人工智能·spring
凯尔萨厮1 小时前
Springboot2.x+Thymeleaf项目创建
java
fish_xk1 小时前
map和set
java·开发语言
李崧正2 小时前
Java技术分享:Lambda表达式与函数式编程
java·开发语言·python
老了,不知天命2 小时前
鳶尾花項目JAVA
java·开发语言·机器学习
二哈赛车手2 小时前
新人笔记---实现简易版的rag的bm25检索(利用ES),以及RAG上传时的ES与向量数据库双写
java·数据库·笔记·spring·elasticsearch·ai
winner88812 小时前
从零吃透C++命名空间、std、#include、string、vector
java·开发语言·c++
AI人工智能+电脑小能手2 小时前
【大白话说Java面试题】【Java基础篇】第26题:Java的抽象类和接口有哪些区别
java·开发语言·面试
bzmK1DTbd2 小时前
SOLID原则在Java中的实践:单一职责与开闭原则
java·开发语言·开闭原则