如何存储唯一对象以避免java Set中的重复项?
例如
考虑员工对象(员工ID,姓名,薪水......)
需要在Set中添加对象的员工列表。 我们需要限制需要通过“员工ID”识别的重复元素的Set。
最好的办法是什么?
答案 0 :(得分:12)
如果您使用java.util.Set
的实施,只要您的equals
和hashCode
方法得到正确实施,就不应允许重复。不知道为什么你的问题上有hashmap和hashtable作为标签。也许你应该改写你的问题并添加给你问题的代码?
编辑:考虑您的修改:
如果您使用Set
,您的员工应该使用以下方法:
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((id == null) ? 0 : id.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 == null) {
if (other.id != null)
return false;
} else if (!id.equals(other.id))
return false;
return true;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((id == null) ? 0 : id.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 == null) {
if (other.id != null)
return false;
} else if (!id.equals(other.id))
return false;
return true;
}
答案 1 :(得分:0)
与@Dirk类似,您还可以使用org.apache.commons中的HashCodeBuilder和EqualsBuilder。
它看起来像这样:
@Override
public int hashCode() {
return new HashCodeBuilder()
.append(id)
.append(name)
.append(salary)
.toHashCode();
}
@Override
public boolean equals(Object obj) {
if (obj instanceof Employee) {
final Employee employee = (Employee) obj;
return new EqualsBuilder()
.append(id, employee.id)
.append(id, employee.name)
.append(id, employee.salary)
.isEquals();
} else {
return false;
}
}
答案 2 :(得分:-1)
仅设置存储唯一对象
例如:
Set set = new HashSet();
// Add elements to the set
set.add("a");//true
set.add("b");//true
set.add("c");//true
set.add("d");//true
set.add("a");//false
当您尝试存储已在Set 中的对象时,add将返回false