Java TreeSet不存储唯一值

时间:2012-05-18 01:09:20

标签: equals hashcode treeset

我有一个名为Artifacts的TreeSet对象。我已经覆盖了对象中的equals和hash代码方法,如下所示:

 @Override
public int hashCode() {
    return new HashCodeBuilder(17, 31). // two randomly chosen prime numbers
        // if deriving: appendSuper(super.hashCode()).
        append(artifactId).
        toHashCode();
}

@Override
public boolean equals(Object arg0) {

    Artifact obj=(Artifact)arg0;

    if(this.getArtifactId().equalsIgnoreCase(obj.getArtifactId()))
    {

            return true;
    }

   return false;
}

我在equals方法中放置了print,但它从未被调用过。我用比较器实例化了TreeSet,如下所示:

 TreeSet<Artifact> syncedList = new TreeSet<Artifact>(new ArtifactComparator());

我已经读过,TreeSet基于等于覆盖建立了它的唯一性。

我在TreeSet中看到多个具有相同ArtifactId的对象,这并不像我需要的那样唯一。

我的equals和哈希码方法中缺少什么东西?

2 个答案:

答案 0 :(得分:2)

正如欧内斯特所说,你需要compareTo()方法。如果你考虑树结构,它不仅需要知道两个对象是否被认为是彼此相等,而是如果一个是“小于”或“大于”,以知道树在哪里放置对象相对于已经存在的那些。即树构建有序列表。

所以,如果你愿意,你可以取消ArtifactComparator类,只需要实现Comparable<Object>的Artifact类,添加compareTo方法,如下所示:

 @Override
 public int compareTo(Object arg0) {
     Artifact obj=(Artifact)arg0;
     return this.getArtifactId().compareToIgnoreCase(obj.getArtifactId());
 }

答案 1 :(得分:1)

TreeMap(此TreeSet)根本不使用您的equals()方法,除非您提取entrySet()keySet()。如果出现问题,则会出现在ArtifactComparator.该类的compareTo()必须返回0以表示两个Artifact相等。