我有一个名为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和哈希码方法中缺少什么东西?
答案 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
相等。