java - 使用 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
在这种情况下有用吗?
解决方案
在大多数情况下,如果您的要求有点具体并且没有真正的帮助。我会做类似的事情:
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 的条目。
推荐阅读
- sql - 使用表行动态创建 SQL 列
- generics - 可变借用在循环的上一次迭代中从这里开始
- python - 雪花响应 Json 有空格吗?
- javascript - IntroJs 步骤部分不在屏幕上
- google-cloud-platform - Terraform Composer 的值 airflow_config_override secrets-backend_kwargs
- visual-studio-code - Visual Studio Code 扩展 goto twig
- amazon-web-services - 连接到关系数据库的容器化 Web 应用程序
- python - TypeError: 'dict' 对象在加载和测试 PyTorch 模型时不可调用
- python - Pandas:对于排序序列 B 的所有元素,查找排序序列 A 中最近元素的索引
- python - 列表到 Numpy 数组和重塑(维度问题)