在集合中查找重复项

Ara*_*ram 5 java guava

在集合中查找和标记重复对象的最佳方法是什么?让我们说我们有一个列表人员,我们的重复策略是基于名字和姓氏的完全匹配.

  1. 确定所有重复项
  2. 标记每个重复的人,表明它是重复的
  3. 对于每个重复的人,确定它是重复的对象

使用番石榴有一种简单的方法吗?

Col*_*inD 5

你不需要Guava这样做:

List<Person> people = ...
Map<Name, Person> peopleByName = new HashMap<>();
for (Person person : people) {
  // Name is a simple value class with equality based on its fields
  Name name = new Name(person.getFirstName(), person.getLastName());
  Person firstPersonWithName = peopleByName.get(name);
  if (firstPersonWithName == null) {
    peopleByName.put(name, person);
  } else {
    // or whatever you do to mark a duplicate
    person.setDuplicateOf(firstPersonWithName);
  }
}
Run Code Online (Sandbox Code Playgroud)

也就是说,您可以使用Guava Table而不是a Map,并且避免需要创建Name...使用第一个名称作为行键,使用姓氏作为列键.

另一种选择是用于Multimaps.index按名称索引列表中的所有人.然后,对于映射到特定名称的每个人员列表,第一个人将是列表中具有该名称的第一个人,其他人将是重复的.