如何筛选无停车位的Employee列表并按司龄排序?附不完整方案咨询
解决方案:筛选无停车位员工并按司龄排序
嘿,你已经搞定了最关键的排序部分,剩下的筛选+组合就很简单啦!结合你已经实现的Comparable接口和自定义比较器,这里给你两种实用的实现方式,适配不同的代码风格:
先确认前提:Employee类结构
首先咱们明确下Employee类的基础结构(和你描述的一致,包含必要的属性、构造方法、Getter以及Comparable实现):
public class Employee implements Comparable<Employee> { private String name; private boolean parkingSpace; private int yearsAtCompany; // 司龄,这里用整数表示,你可以根据实际类型调整 // 构造方法 public Employee(String name, boolean parkingSpace, int yearsAtCompany) { this.name = name; this.parkingSpace = parkingSpace; this.yearsAtCompany = yearsAtCompany; } // 必要的Getter方法 public boolean isParkingSpace() { return parkingSpace; } public int getYearsAtCompany() { return yearsAtCompany; } // 重写Comparable的compareTo,按司龄升序排序(可根据需求调整) @Override public int compareTo(Employee other) { return Integer.compare(this.yearsAtCompany, other.yearsAtCompany); } // 可选:重写toString方便验证结果 @Override public String toString() { return "Employee{name='" + name + "', parkingSpace=" + parkingSpace + ", yearsAtCompany=" + yearsAtCompany + "}"; } }
方法1:使用Stream API(现代简洁风格)
Stream API可以让你用链式调用一步完成筛选和排序,代码可读性极高:
import java.util.List; import java.util.stream.Collectors; public class EmployeeHandler { public static void main(String[] args) { // 模拟你的10人员工列表 List<Employee> employees = List.of( new Employee("Alice", true, 5), new Employee("Bob", false, 3), new Employee("Charlie", false, 7), new Employee("Diana", true, 2), new Employee("Eve", false, 4), new Employee("Frank", false, 1), new Employee("Grace", true, 6), new Employee("Henry", false, 8), new Employee("Iris", true, 3), new Employee("Jack", false, 5) ); // 核心逻辑:筛选无停车位员工 → 按司龄排序 List<Employee> noParkingSortedByYears = employees.stream() // 筛选条件:parkingSpace为false .filter(employee -> !employee.isParkingSpace()) // 排序:因为Employee实现了Comparable,直接用sorted()即可;如果要用自定义比较器,传入sorted(yourCustomComparator) .sorted() // 收集为最终列表 .collect(Collectors.toList()); // 打印结果验证 noParkingSortedByYears.forEach(System.out::println); } }
自定义比较器的使用
如果你不想用Comparable的默认排序逻辑,而是想用你已经写好的自定义比较器,只需要把.sorted()换成:
.sorted(yourCustomComparator)
比如你的自定义比较器是按司龄降序的:
import java.util.Comparator; Comparator<Employee> yearsDescComparator = (e1, e2) -> Integer.compare(e2.getYearsAtCompany(), e1.getYearsAtCompany());
方法2:传统集合操作(兼容旧版Java或偏好命令式风格)
如果你更习惯传统的循环和集合操作,也可以分两步完成:
import java.util.ArrayList; import java.util.Collections; import java.util.List; public class EmployeeHandler { public static void main(String[] args) { List<Employee> employees = List.of( // 同上面的员工列表... ); // 第一步:筛选无停车位的员工 List<Employee> noParkingEmployees = new ArrayList<>(); for (Employee emp : employees) { if (!emp.isParkingSpace()) { noParkingEmployees.add(emp); } } // 第二步:排序 Collections.sort(noParkingEmployees); // 使用Comparable的默认排序 // 如果用自定义比较器:Collections.sort(noParkingEmployees, yourCustomComparator); // 打印结果 noParkingEmployees.forEach(System.out::println); } }
额外小提示
- 如果需要降序排序,除了自定义比较器,也可以用
Comparator.reverseOrder():- Stream方式:
.sorted(Comparator.reverseOrder()) - 传统方式:
Collections.sort(noParkingEmployees, Collections.reverseOrder())
- Stream方式:
- 确保你的Employee类的Getter方法正确实现,因为筛选和排序都依赖属性的获取。
内容的提问来源于stack exchange,提问作者Mezzadri
相关产品推荐
相关产品推荐

