要求是找到部门 2 的组号 8 和部门 2 的组号 4 的最新员工对象(最新日期)。同样的方法,部门 1 中的组号 8 和部门 1 中的组号 4。我只在最终列表中需要上述所有对象中的最新一个对象。
写的比较逻辑是按照需要的顺序排序,只保留需要的对象。但是我被困住了,因为我找不到从排序列表中保留单个对象的方法。无论如何我可以实现它吗?忽略比较器逻辑,如果您可以建议使用流或其他良好实现的任何 ootb 方式,我将不胜感激?
SimpleDateFormat df = new SimpleDateFormat("dd-mm-yyyy");
List<Employee> employees = new LinkedList<Employee>(Arrays.asList(
new Employee("Emp1", df.parse("12-08-2020"),
new EmpType("1", new Group(8))),
new Employee("Emp2", df.parse("11-08-2020"),
new EmpType("2", new Group(8))),
new Employee("Emp3", df.parse("10-08-2020"),
new EmpType("2", new Group(4))),
new Employee("Emp4", df.parse("17-08-2020"),
new EmpType("2", new Group(8))),
new Employee("Emp5", df.parse("19-08-2020"),
new EmpType("1", new Group(4)))));
/* Sorting logic to sort by group number first then by department and then by date */
Collections.sort(employees, new Comparator<Employee>() {
@Override
public int compare(Employee employee, Employee t1) {
int val = 0;
if (employee.getEmpType().getGroup().getNumber() < t1.getEmpType().getGroup().getNumber()) {
val = 1;
} else if (employee.getEmpType().getGroup().getNumber() > t1.getEmpType().getGroup()
.getNumber()) {
val = -1;
} else {
val = 0;
}
if (val == 0) {
val = -(employee.getEmpType().getDepartment().compareTo(t1.getEmpType().getDepartment()));
}
if (val == 0) {
val = -employee.getDate().compareTo(t1.getDate());
}
return val;
}
});
最佳答案
您可以使用 Collections.max
而不是排序使用您已实现的相同 Comparator
。
编辑以解决评论中的讨论:
如果我对数据结构的理解正确,EmpType
封装了我们想要为其找到“最新”员工的唯一组合。假设它正确实现了 equals(Object)
和 hashCode()
方法,您可以流式传输列表并将其收集到来自 EmpType< 的 map
给最新的员工:
Map<EmpType, Employee> latestEmployees =
employees.stream()
.collect(Collectors.toMap(
Employee::getEmpType,
Function.identity(),
BinaryOperator.maxBy(
Comparator.comparing(Employee::getDate))));
关于Java排序逻辑和识别两个对象的最大值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63859540/