gpt4 book ai didi

java - 从列表中删除重复的条目并保留最后更新的条目 LocalDate

转载 作者:行者123 更新时间:2023-12-02 00:59:30 25 4
gpt4 key购买 nike

我有一个包含以下字段的员工类。

class Employee {
final int id;
final String name;
final LocalDate updatedDate;
// setters and getters
}

我有一个员工列表,该列表可能包含具有不同updatedDate 的重复员工。现在我想创建一个集合,让每个 employeeId 都有一个唯一的条目。如果存在重复条目,则应保留最新 updatedDate 的条目。

我想出了以下解决方案,根据 updatedDate 排序并添加它 TreeSet ,以保持 Id 的唯一性。我可以通过在 Employee 中实现 hashcode 和 equals 来使用 HashSet

List<Employee> employees = new ArrayList<>();

// sort
List<Employee> sortedList = employees.stream()
.sorted(Collections.reverseOrder(Comparator.comparing(employee -> employee.updatedDate)))
.collect(Collectors.toList());

Set<Employee> employeeSet = new TreeSet<>(Comparator.comparing( employee -> employee.id));
sortedList.forEach(employeeSet::add);

现在的问题是,大多数时候员工列表都会包含唯一的元素。很少会有重复的条目。当仅存在唯一条目时进行排序将无法很好地扩展。有没有办法通过避免排序来改进上述解决方案?

最佳答案

解决此问题的另一种方法是使用 groupingBy 收集器,然后使用 collectingAndThen 收集器查找最新的 updatedDate。我认为这种方式更具可读性和简洁性。

为了简化,我将收集器导入为静态。

import static java.util.stream.Collectors.collectingAndThen;
import static java.util.stream.Collectors.maxBy;
import static java.util.stream.Collectors.groupingBy;

Collection<Employee> collection = employees.stream()
.collect(groupingBy(Employee::getId,
collectingAndThen(maxBy(Comparator.comparing(Employee::getUpdatedDate)),
employee -> employee.orElse(null)))).values();

然后

List<Employee> result = new ArrayList<>(collection);

关于java - 从列表中删除重复的条目并保留最后更新的条目 LocalDate,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60889679/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com