HashSet:无法删除相等的对象?

时间:2014-11-20 19:34:48

标签: java equals hashset

在我的代码中,我试图删除HashSet中的元素。我在我的对象中覆盖了equals方法。

for (BitVector bv : implicantsToDeleteViaBitVector) {
            System.out.println(bv + " , " + bv.hashCode());

            for(BitVector bvSetbv : bvSet){
                if(bv.equals(bvSetbv)){
                    System.out.println("match " + bv);
                }else{
                    System.out.println("No match " + bv + "," + bvSetbv);
                }
            }

            if(bvSet.remove(bv)){
                System.out.println("Remove");
            }else{
                System.out.println("No match found by remove");
            }
...

问题是我的equals方法将返回true但我的remove在正在检查的同一项上返回false。这是等于方法:

@Override
public boolean equals(Object o) {
    if (this == o)
        return true;
    if (!(o instanceof BitVector))
        return false;
    BitVector v = (BitVector) o;
    boolean sameSize = mySize == v.getSize();
    boolean sameTerms = this.bitVectorList
            .containsAll(v.getBitVectorList());

    return (sameSize && sameTerms);
}

删除是否在类中使用equals()方法?如果是这样,那么为什么这段代码不起作用?

3 个答案:

答案 0 :(得分:8)

你说:

  

我已经覆盖了我的对象中的equals方法。

你还需要覆盖hashCode()方法,它的契约应该是如果两个对象相等,那么它们的hashCodes也必须相等,尽管反过来不一定是因为它是可能的并且允许对于两个具有哈希码且不相等的对象,尽管如果可能的话应该避免这种情况。

答案 1 :(得分:4)

可能的问题之一是可变对象(更准确地说是可变的哈希码)。向HashSet添加对象时,哈希码只会计算一次。因此,如果您更改对象并尝试删除'来自集合的SAME对象不会删除该对象。

答案 2 :(得分:0)

通过覆盖hasCode和等值方法,您可以解决问题

  public int hashCode(){
        System.out.println("In hashcode");
        int hashcode = 0;
        hashcode = price*20;
        hashcode += item.hashCode();
        return hashcode;
    }

    public boolean equals(Object obj){
        System.out.println("In equals");
        if (obj instanceof Price) {
            Price pp = (Price) obj;
            return (pp.item.equals(this.item) && pp.price == this.price);
        } else {
            return false;
        }
    }


public String toString(){
        return "item: "+item+"  price: "+price;
    }