【发布时间】:2019-10-23 23:40:28
【问题描述】:
我有一个包含 id、name 和 address 字段的员工类。如果两个员工的 id 和 name 完全相同,则认为他们是相同的。现在我有一个员工列表,现在我的任务是获取重复员工的集合。
这是我的 Employee 类代码,其中包含基于 id 和 name 字段覆盖的 hascode 和 equals 方法。
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 在这种情况下有用吗?
【问题讨论】:
-
您可以使用以下代码
System.out.println(list.stream().filter(em -> list.indexOf(em) > -1 && list.get(list.indexOf(em)) != em).collect(Collectors.toSet()));对嵌套循环执行相同的逻辑 -
这里的预期结果是什么?
new Employee(1, "John", "SFO")和new Employee(1, "John", "NJ")两者都被视为彼此重复。您想获得 both 还是只获得 one (在这种情况下,您要选择哪个标准)? IMO 获得重复意味着收集 所有 可以被视为相等的单独元素。 -
或者,您可能只想获得每个“员工类别”中的一个代表,而不管它是该类别中的哪一个?
-
java.util.HashSet不存在这个原因吗?