You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何按姓名(重名按姓氏)及薪资对Employee列表排序?

实现多条件排序的几种方式

给定的Employee类和员工列表,要实现先按firstName排序,firstName相同则按lastName排序,最后按salary排序的逻辑,有以下几种常见实现方式:

方式一:自定义Comparator(兼容Java 8之前版本)

通过匿名内部类实现Comparator<Employee>,重写compare方法依次比较三个字段:

Collections.sort(employeeList, new Comparator<Employee>() {
    @Override
    public int compare(Employee e1, Employee e2) {
        // 优先比较firstName
        int firstNameCompare = e1.getFirstName().compareTo(e2.getFirstName());
        if (firstNameCompare != 0) {
            return firstNameCompare;
        }
        // firstName相同时比较lastName
        int lastNameCompare = e1.getLastName().compareTo(e2.getLastName());
        if (lastNameCompare != 0) {
            return lastNameCompare;
        }
        // 前两个字段都相同时比较salary
        return e1.getSalary().compareTo(e2.getSalary());
    }
});

方式二:Java 8 Lambda表达式简化写法

用Lambda替代匿名内部类,逻辑和上述一致,代码更简洁:

Collections.sort(employeeList, (e1, e2) -> {
    int firstNameCompare = e1.getFirstName().compareTo(e2.getFirstName());
    if (firstNameCompare != 0) return firstNameCompare;
    int lastNameCompare = e1.getLastName().compareTo(e2.getLastName());
    if (lastNameCompare != 0) return lastNameCompare;
    return e1.getSalary().compareTo(e2.getSalary());
});

方式三:Java 8 Comparator链式调用(最简洁写法)

利用Comparator.comparing方法链式指定排序字段,自动处理优先级:

employeeList.sort(Comparator.comparing(Employee::getFirstName)
        .thenComparing(Employee::getLastName)
        .thenComparing(Employee::getSalary));

如果需要对某个字段降序,可在对应字段后追加.reversed(),例如让salary按降序排列:

employeeList.sort(Comparator.comparing(Employee::getFirstName)
        .thenComparing(Employee::getLastName)
        .thenComparing(Employee::getSalary, Comparator.reverseOrder()));

方式四:让Employee实现Comparable接口

如果该排序逻辑是Employee的默认排序规则,可以让类实现Comparable<Employee>接口,重写compareTo方法:

class Employee implements Comparable<Employee> {
    String firstName;
    String lastName;
    Double salary;

    Employee(Double salary, String firstName, String lastName) {
        this.salary = salary;
        this.firstName = firstName;
        this.lastName = lastName;
    }

    // getter and setters

    @Override
    public int compareTo(Employee other) {
        int firstNameCompare = this.firstName.compareTo(other.firstName);
        if (firstNameCompare != 0) return firstNameCompare;
        int lastNameCompare = this.lastName.compareTo(other.lastName);
        if (lastNameCompare != 0) return lastNameCompare;
        return this.salary.compareTo(other.salary);
    }
}

之后直接调用列表的sort方法即可:

employeeList.sort(null);
// 或使用Collections.sort
Collections.sort(employeeList);

内容的提问来源于stack exchange,提问作者Abhijeet Ranade

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 07:23:37