首页 > 解决方案 > 使用 java 8 查找重复项

问题描述

我有一个带有 id、name 和 address 字段的员工类。如果两个员工的 id 和 name 完全相同,则认为他们是相同的。现在我有一个员工列表,现在我的任务是获取重复员工的集合。

这是我的 Employee 类代码,其中 hascode 和 equals 方法基于 id 和 name 字段被覆盖。

class Employee {
    int id;
    String name;
    String address;

    public Employee(int id, String name, String address) {
        this.id = id;
        this.name = name;
        this.address = address;
    }

    @Override
    public String toString() {
        return "Employee [id=" + id + ", name=" + name + ", address=" + address + "]";
    }


    // auto generated by eclipse based on fields for id and name    
    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + id;
        result = prime * result + ((name == null) ? 0 : name.hashCode());
        return result;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        Employee other = (Employee) obj;
        if (id != other.id)
            return false;
        if (name == null) {
            if (other.name != null)
                return false;
        } else if (!name.equals(other.name))
            return false;
        return true;
    }

}

现在我有这个代码来查找重复的员工

public static void main(String[] args) {
    Employee e1 = new Employee(1, "John", "SFO");
    Employee e2 = new Employee(2, "Doe", "NY");
    Employee e3 = new Employee(1, "John", "NJ");

    List<Employee> list = Arrays.asList(e1, e2, e3);

    Set<Employee> set = new HashSet<>();
    for (int i = 0; i < list.size(); i++) {
        for (int j = i + 1; j < list.size(); j++) {
            if (list.get(i).equals(list.get(j))) {
                set.add(list.get(i));
            }
        }
    }

    System.out.println(set);
}

此代码工作正常,并在我的集合中为我提供了 id 为 1 的员工。

如何使用 Java 8 lamda 和流进行相同的操作?flatmap在这种情况下有用吗?

标签: javajava-8

解决方案


在大多数情况下,如果您的要求有点具体并且没有真正的帮助。我会做类似的事情:

final Map<Employee, Long> groupedWithCount = employees.stream()
        .collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));

现在您拥有所需的所有信息以及更多信息。员工在此地图中按计数分组,您的数据如下所示:

{
  Employee [id=2, name=Doe, address=NY] = 1,
  Employee [id=1, name=John, address=SFO] = 2
}

显然,重复项是值 > 1 的条目。


推荐阅读