2013-05-03 7 views
0

가정하자 개체.HashMap에 사용하여 사용자 데이터 I는 해시 MAP 가지고

HM.put(new MyKey(1,1234), 1); // this seems to work... 

하지만, 나는 그것을 사용할 수없는 것 :

System.out.println(HM.containsKey(new MyKey(1,1234))); 

내가 거짓 얻을.

HashMap에 키에 대한 사용자 지정 데이터 개체가있을 수 있습니까? 내가 뭘 놓치고 있니? 감사합니다 ...

답변

1

MyKey 클래스 또는 HashMap 또는 Set에 들어갈 수있는 다른 사용자 지정 클래스에서 equals()hashcode() 메서드를 재정의해야합니다. 그렇게하면 containsKey() (또는 Set 메서드 또는 equals())을 말할 때 포함 또는 동등성을 검사 할 MyKey의 속성을 명시 적으로 지정했을 것입니다.

당신은 컴파일하면

@Override 
public boolean equals(Object o) { 
    boolean result = false; 
    if (o instanceof MyKey) { 
     MyKey mykey = (MyKey) o; 
     result = (this.getX() == mykey.getX() && mykey.getY() == mykey.getY()); 
    } 
    return result; 
} 

@Override 
    public int hashCode() { 
     final int prime = 31; 
     int result = 1; 
     result = prime * result + X; 
     result = prime * result + Y; 
     return result; 
    } 

+0

시도한 경우 : System.out.println (HM.containsKey (MyKey (1,1234))); –

+0

그런 다음 "기호를 찾을 수 없습니다"(MyKeys를 참조). 언어 적으로, 나는 항목을 넣을 수 있다는 것이 상당히 이상하지만, 실제로는 원래 지정된 항목이 있어야합니다. 사본이 아닙니다. 어쨌든 도움을 주셔서 감사합니다. 나는 실제 아이템을 찾기 위해 HashList를 반복하고있다. –

+0

@n을 으로 대답했습니다. 내 대답을 편집했습니다. equals를 오버라이드 (override)하는 경우, hashCode도 오버라이드 (override) 할 필요가 있습니다. 또한 참조하십시오 : http://stackoverflow.com/questions/27581/overriding-equals-and-hashcode-in-java 희망이 도움이됩니다. – Shobit

0

System.out에서 new MyKey()을 생성 중입니다. 해시 맵에 MyKey(1,1234)이 포함되어 있는지 확인하고 싶지 않은 경우 new MyKey(1,1234)이 아닌지 확인하고 싶습니다.

+0

(당신의있는 MyKey 클래스의 필드입니다 X와 Y를 가정) 만하면, 그것은 '의미 당신의있는 MyKey 클래스에서이 같은 간단한 equals()hashCode() 방법을 가질 수있다 containsKey'는 포인터가 필요합니까? – Elazar

+0

반드시 그렇지는 않습니다 - OP가 사용하는 해시 맵의 특정 구현에 따라 다릅니다. 그것은 기존의 객체에 대한 참조와 같이 새로운 구문으로 행복하게 컴파일 할 수 있고 (결코 true를 반환하지 않을 수도 있습니다). – NWard