如何按姓名(重名按姓氏)及薪资对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
相关产品推荐
相关产品推荐

