HashSet包含对象,我想删除其对象具有相同id
的重复项以下是代码..
Set<Employee> empSet=new HashSet<Employee>();
empSet.add(new Employee(1,"naresh"));
empSet.add(new Employee(2,"raj"));
empSet.add(new Employee(1,"nesh"));
empSet.add(new Employee(2,"rajes"));
//我在一些博客中看到我们可以使用hashCode equals方法,但我不知道如何在这种情况下使用它,请帮帮我
答案 0 :(得分:1)
import groovy.transform.EqualsAndHashCode
@EqualsAndHashCode(includes='id')
class Employee {
int id
String name
}
如果使用@Canonical
AST,您也可以删除构造函数。 Canonical还提供@EqualsAndHashCode
,但要添加包含它必须再次单独使用。
更新
如果类不可修改并且您有list / hasSet,则可以使用带有闭包的unique
来执行唯一性。假设评论中提到的SolrDocument
被称为Employee
,并且上面的HashSet有重复的ids
,那么下面应该有效:
empSet.unique { it.id } //this mutates the original list
empSet.unique( false ) { it.id } //this does not mutate the original list
答案 1 :(得分:0)
编写equals和hashCode,如下所示
public class Employee {
private int id;
private String name;
public Employee(int id, String name) {
this.id = id;
this.name = name;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Employee employee = (Employee) o;
if (id != employee.id) return false;
return true;
}
@Override
public int hashCode() {
return id;
}
}
答案 2 :(得分:0)
您需要在Employee类中重写equals()方法,它将被处理。 Set使用equals方法比较Set中插入的对象。
public class Employee
{
public boolean equals(Employee e)
{
/// logic to compare 2 employee objects
}
}