2014-11-20 3 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를 반환하지만 내 제거는 검사중인 동일한 항목에서 false를 반환한다는 것입니다. 다음과 같은 equals 메서드입니다.

@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 메소드를 오버라이드 (override) 한

. 그 반대가 가능하고 허용되는 것을 꼭 그렇지는 아니지만

, 당신은 또한 hashCode() 메소드를 오버라이드 (override) 할 필요가, 그 계약은 두 객체가 동일한 경우, 그들의 해시 코드도 동일해야해야한다 두 객체가 해시 코드를 가지며 같지 않아야합니다. 가능한 경우이를 피해야하는 객체입니다.

+0

나는 해시 코드를 한 번 봐 가지고 가고 해시 코드뿐만 아니라 동일한 것으로 보인다 수정할 수 있습니다. 아직 제거는 거짓으로 돌아옵니다. – Faytll

+0

@Faytll : 그렇다면 컴파일 할 수있는 가장 작은 비트로 코드를 압축하는 [Minimal, Complete, Verifiable Example Program] (http://stackoverflow.com/help/mcve)을 만들고 게시하는 것이 좋습니다. (데이터베이스 또는 이미지에 연결해야하는 등) 외부 종속성이없고, 문제와 관련이없는 추가 코드가 없지만 여전히 문제를 보여줍니다. –

4

가능한 문제 중 하나는 변경 가능한 개체 (더 정확하게 변경할 수있는 해시 코드)입니다. HashSet에 객체를 추가하면 해시 코드는 한 번만 계산됩니다. 따라서 개체를 변경하고 컬렉션에서 SAME 개체를 '제거'하려고하면 개체가 삭제되지 않습니다. hasCode 및 방법은 다음과 같은 동일한 방법을 재정 의하여

0

, 당신은 당신의 문제

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