2009-02-26 9 views
0

나는 두 개의 정수를 저장하는 MyClass을 가지고 있으며 은 myVector입니다.Java : 벡터에서 사용자 정의 객체 제거

는 지금, 나는이 작업을 수행 :

... 
myVector.add(new MyClass(1,1)); 
for(MyClass m : myVector) 
    System.out.println(m); 
System.out.println(myVector.size()); 

myVector.remove(new MyClass(1,1)); 
for(MyClass m : myVector) 
    System.out.println(m); 
System.out.println(myVector.size()); 
... 

여기서 문제는 제가 벡터와 크기를 인쇄 할 때 내가 볼로 개체가 제거되지 않는 것입니다. 내가 어떻게 고칠 수 있니?

편집 : 나는 물체를 발견하지 않고 내가 확실하게 contains() 테스트 한 것을 볼 수 있습니다. 내가 필요한 것은 그것을 가치로 비교하는 것입니다. == 연산자를 너무 많이 오버로드 할 수는 있지만이를 해결할 방법이 없습니다.

편집 2 : 좋아요, equals()은 내가 원하는대로 할 것입니다. 하지만 hashCode 메서드를 무엇에 넣을지 잘 모르겠습니다.

편집 3 : 내가 contains()를 사용하여 찾을 수 있지만 remove는 제거하지 않습니다.

위의 코드를 제외하고, 제거 (새 MyClass에 (1,1)과 동일
int position = myVector.indexOf(new MyClass(1,1)); 
myVector.remove(position); 

가 작동하지 어떤 생각을한다) (제거 :

그래도 난 그것을 제거하려면이 옵션을 사용할 수 있습니다. ?

+0

나는 클래스가 대문자로 시작해야하기 때문에 자유롭게 MyClass를 자본화했습니다. –

+0

오케이, 죄송합니다. 나는 이름이 잘 못됩니다. –

+0

PDF 읽기 hashCode()에 대한 정보는에 링크되어 있습니다. –

답변

0

grammar31's answer;에서 몇 가지 오류가 또이를 해결 있습니다

@Override 
public boolean equals(Object o) { 
    if ((o == null) || (o.getClass() != myClass.class)) { 
    return false; 
    } 
    myClass other = (myClass) o; 
    return (other.a == this.a) && (other.b == this.b); 
} 

@Override 
public int hashCode() { 
    return a * 31 + b; 
} 

myClassint 회원 ab을 가지고 가정합니다.

1

당신은 그것이 첫 번째와 같은 값을 포함하더라도, 다른 myClass가를 제거하려는.

당신이 그 (것)이 동일한 것으로 간주 될하려는 경우에 myClass가의 equals 메소드를 오버라이드 (override) 할 필요가 값이 같은지 확인하십시오.

+0

그리고 당연히 해시 코드 방법. 이클립스에는 괜찮은 자동 생성기가있다. – JeeBee

0

당신은 두 객체가, 음 ... 동일하게 간주하는 .equals()를 구현해야합니다. 그러나 .equals().hashCode()에 대한 계약은 기본적으로 당신이 .equals()을 구현할 때마다 .hashCode()를 구현할 필요가 있음을 알려줍니다 명심하십시오.

Chapter 3 of Effective Java 자세한 내용을 알려드립니다.

  • 가 MyClass에 대한 equals()을 구현, 또는
  • 당신은 당신의 코드를 추가 한 동일한 인스턴스를 제거하기 위해 수정

을 추가 동일한 개체 인스턴스를 제거 :

2

당신은 두 가지 선택이

MyClass myClass = new myClass(1,1); 
myVector.add(myClass); 
for(myClass m : myVector) 
    System.out.println(m); 
System.out.println(myVector.size()); 

myVector.remove(myClass); 
for(myClass m : myVector) 
    System.out.println(m); 
System.out.println(myVector.size()); 

나는 다른 사람들이 샘플 IMPL을 준 것을 볼 수 equals()에 대한 설명 -하지만 당신이 원하는 것을 결정해야합니까? 아주 잘 될지도 모릅니다. 위의 두 가지 선택 중 어느 것이이 물체에 적합한 지 선택하십시오.

다른 사람은 당신이 equals()을 구현하는 경우 다음 hashCode()를 구현해야합니다, 말했듯이. Eclipse는 equals()hashCode() 모두를 구현하는 좋은 마우스 오른쪽 단추로 클릭 옵션이 있습니다.코드 문제가 누군가 equals() 만 구현 한 것을 보았습니다. 이론적 인 문제인 것 같지만 실제로는 그렇지 않습니다.

관련 문제