5

java - 如何存储唯一对象以避免java Set中的重复?

例如

考虑 Employee 对象(员工 ID、姓名、薪水……)

需要在 Set 中添加的对象的员工列表。我们需要对需要通过“Employee Id.”标识的重复元素的 Set 进行限制。

最好的方法是什么?

4

3 回答 3

16

如果您使用的是 a 的实现,java.util.Set只要您的equalshashCode方法正确实现,它就不应该允许重复。不知道为什么你有 hashmap 和 hashtable 作为你的问题的标签。也许您应该改写您的问题并添加给您带来问题的代码?

编辑:考虑您的编辑:

如果你使用 a Set,你的 Employee 应该有以下方法:


    @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;
      }
于 2012-10-08T07:10:57.527 回答
2

与@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;
    }
}
于 2018-10-08T13:23:03.813 回答
-3

设置仅存储唯一对象

例如:

 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

于 2012-10-08T07:09:09.093 回答