1

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

 @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 方法中,但它从未被调用过。我已经用一个如下所示的比较器实例化了 TreeSet:

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

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

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

我的等号和哈希码方法中是否缺少某些内容?

4

2 回答 2

2

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

因此,您可以根据需要取消ArtifactComparator该类,只需让您的 Artifact 类实现Comparable<Object>,添加如下compareTo方法:

 @Override
 public int compareTo(Object arg0) {
     Artifact obj=(Artifact)arg0;
     return this.getArtifactId().compareToIgnoreCase(obj.getArtifactId());
 }
于 2012-05-18T02:23:23.270 回答
1

TreeMap(和 this TreeSet)根本不使用您的equals()方法,除非您获取entrySet()or keySet()。如果有问题,它将在ArtifactComparator.That class's compareTo()must return0以指示两个Artifacts 相等。

于 2012-05-18T01:15:09.200 回答