【问题标题】:Java TreeSet not storing unique valuesJava TreeSet 不存储唯一值
【发布时间】:2012-05-18 01:09:20
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: equals hashcode treeset


    【解决方案1】:

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

    因此,如果您愿意,您可以取消 ArtifactComparator 类,只需让您的 Artifact 类实现 Comparable&lt;Object&gt;,添加 compareTo 方法,如下所示:

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

    【讨论】:

      【解决方案2】:

      TreeMap(和这个TreeSet)根本不使用你的equals()方法,除非你获取entrySet()keySet()。如果有问题,就会出现在ArtifactComparator. 那个类的compareTo() 必须返回0 以表明两个Artifacts 是相等的。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-05-21
        • 2015-04-30
        • 1970-01-01
        • 2016-10-24
        • 1970-01-01
        • 2014-03-31
        • 2011-06-26
        • 1970-01-01
        相关资源
        最近更新 更多