如何使用Guava或Commons Collections根据条件删除集合中的重复项

时间:2015-11-23 08:28:23

标签: java guava apache-commons-collection

我有关于员工详细信息的对象数组列表。我需要根据员工ID找到重复的员工,并使用创建日期删除旧员工的详细信息。

我需要使用Google Guava或Apache Commons Collection。

2 个答案:

答案 0 :(得分:0)

我认为您不需要使用Guava或Apache Collections。

您只需创建员工ID到员工详细信息的地图,然后更新此地图以获取最近创建的员工详细信息:

LinkedHashMap<EmployeeId, EmployeeDetails> map = new LinkedHashMap<>();
for (EmployeeDetails details : list) {
  if (!map.containsKey(details.getEmployeeId())) {
    map.put(details.getEmployeeId(), details);
  } else {
    EmployeeDetails previous = map.get(details.getEmployeeId());
    if (previous.getCreatedDate().before(details.getCreatedDate())) {
      map.put(details.getEmployeeId(), details);
    }
  }
}
List<EmployeeDetails> deduplicated = new ArrayList<>(map.values());

答案 1 :(得分:0)

如果您没有被迫使用Google Guava或Apache Commons Collection,只需使用Java 8(使用Integer作为id,但可以是任何内容):

Map<Integer, List<Employee>> employeeMap = employees.stream()
    .collect(Collectors.groupingBy(Employee::getId));

List<Employee> filtered = collect.entrySet().stream()
    .map(e -> Collections.max(e.getValue(), Comparator.comparing(Employee::getCreatedDate)))
    .collect(Collectors.toList());

如果你需要使用番石榴,这应该有效:

    Map<Integer, Collection<Employee>> employeeMap = Multimaps.index(employees, Employee::getId).asMap();
    Collection<Employee> filtered = Maps.transformValues(employeeMap, l -> Ordering.from(Comparator.comparing(Employee::getCreatedDate)).max(l)).values();