Lambda表达式自定义排序,升序再降序

在对list排序的时候可能会碰到两个数据维度的自定义排序

比如一组学生数据,有考试状态,要按照考试状态为未考试(考试状态 0 未考试 1 已通过 2 未通过)的排在前面,其他的状态按照考试时间降序排列。

实体类

@Data
@AllArgsConstructor
public class Student {

    private Integer id;

    private String name;

    /**
     *  考试状态 0 未考试  1 已通过 2 未通过
     */
    private Integer status;

    /**
     * 考试时间
     */
    @JSONField(format = "YYYY-mm-dd HH:mm:ss")
    private LocalDateTime timeOfTest;


 
}

排序代码

public static void main(String[] args) {
        List<Student> list = new ArrayList<Student>();

        list.add(new Student(2, "Sherry", 1, LocalDateTime.parse("2022-05-19T12:34:56")));
        list.add(new Student(3, "Tom", 0,LocalDateTime.parse("2022-05-19T11:55:56")));
        list.add(new Student(1, "Tom", 2, LocalDateTime.parse("2022-05-19T15:34:56")));
        list.add(new Student(5, "Lily", 1, LocalDateTime.parse("2022-05-19T16:11:56")));
        list.add(new Student(4, "Alisa", 1,LocalDateTime.parse("2022-05-19T22:00:56")));

        List<Student> students=list.stream().sorted((p1,p2) ->{
            //如果状态等于0(未考试),按照考试状态升序排
            if (p1.getStatus().equals(0) || p2.getStatus().equals(0)){
                return p1.getStatus()-p2.getStatus();
            }else {
                return p2.getTimeOfTest().compareTo(p1.getTimeOfTest());
            }
        }).collect(Collectors.toList());

        System.out.println(JSON.toJSONString(students));
    }

输出结果

[
    {
        "id":3,
        "name":"Tom",
        "status":0,
        "timeOfTest":"2022-05-19T11:55:56"
    },
    {
        "id":4,
        "name":"Alisa",
        "status":1,
        "timeOfTest":"2022-05-19T22:00:56"
    },
    {
        "id":5,
        "name":"Lily",
        "status":1,
        "timeOfTest":"2022-05-19T16:11:56"
    },
    {
        "id":1,
        "name":"Tom",
        "status":2,
        "timeOfTest":"2022-05-19T15:34:56"
    },
    {
        "id":2,
        "name":"Sherry",
        "status":1,
        "timeOfTest":"2022-05-19T12:34:56"
    }
]

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
优先队列是一种数据结构,可以根据元素的优先级来进行插入和删除操作。在C++中,可以使用自定义排序lambda表达式来实现对优先队列的排序。 下面是一个示例代码,演示了如何使用lambda表达式自定义排序规则来创建一个具有自定义排序功能的优先队列: ```cpp #include <iostream> #include <queue> using namespace std; struct Person { string name; int age; // 自定义排序规则 bool operator<(const Person& other) const { // 根据年龄进行降序排序 return age < other.age; } }; int main() { // 创建一个优先队列,使用lambda表达式作为自定义排序规则 priority_queue<Person, vector<Person>, function<bool(const Person&, const Person&)>> pq([](const Person& p1, const Person& p2) { // 根据姓名长度进行升序排序 return p1.name.length() > p2.name.length(); }); // 添加元素到优先队列 pq.push({"Alice", 25}); pq.push({"Bob", 30}); pq.push({"Charlie", 20}); // 输出排序后的结果 while (!pq.empty()) { Person p = pq.top(); pq.pop(); cout << "Name: " << p.name << ", Age: " << p.age << endl; } return 0; } ``` 在这个示例中,我们定义了一个名为Person的结构体,其中包含了姓名和年龄两个成员变量。我们通过在结构体中重载小于运算符来定义排序规则,即根据年龄进行降序排序。 在主函数中,我们创建了一个优先队列(priority_queue)对象pq,并使用lambda表达式作为自定义排序规则。lambda表达式接受两个Person对象作为参数,并返回一个bool值,表示它们的相对顺序。 然后,我们向优先队列中添加了几个Person对象,并通过循环不断从队列中取出元素,直到队列为空。输出结果按照我们定义的排序规则进行了排序。 希望这个示例对你有帮助!如果你还有其他问题,请随时提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值