2014-11-20 10 views
1

在我的代碼中,我試圖刪除HashSet中的元素。我已經覆蓋了我的對象中的equals方法。HashSet:無法刪除一個對等的對象?

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()方法?如果是這樣,那麼爲什麼這個代碼不工作?

回答

8

幽州:

我已重寫我的對象equals方法。

您還需要重寫hashCode()方法,它的合同應該是,如果兩個對象是相等的,那麼它們的散列碼也必須是平等的,但反過來未必是真實的,因爲它是可能的,允許兩個對象具有散列碼並且不相等,儘管如果可能的話應該避免這種情況。

+0

我在的hashCode了一下和散列碼似乎是相等。然而,刪除仍然是錯誤的。 – Faytll 2014-11-20 19:40:36

+0

@Faytll:那麼你會想要考慮創建併發佈一個[最小,完整和可驗證的示例程序](http://stackoverflow.com/help/mcve),您可以將代碼壓縮到最小的位,然後編譯並且運行,沒有外部依賴(例如需要鏈接到數據庫或圖像),沒有額外的代碼與您的問題無關,但仍顯示您的問題。 – 2014-11-20 19:41:34

4

其中一個可能的問題是可變對象(更準確地說是可變的哈希碼)。當您將對象添加到HashSet時,哈希碼將僅計算一次。因此,如果您更改對象並嘗試從集合中「刪除」SAME對象,則該對象將不會被刪除。

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; 
    }