2013-02-23 1 views
6

내 질문은 아주 간단하다고 생각하지만 해결책을 찾지 못해서 여기서 물어보기로했습니다. 내가 뭘해야 할 것은이 같은 사용자 지정 키의 형태는 HashMap을 만드는 것입니다 : HashMap의가 제대로 작동하지 때문에 내가 여기서 뭔가를 놓치고 그러나자바 HashMap을 맞춤 키 유형으로 올바르게 작동시키는 방법은 무엇입니까?

HashMap<Pair<Integer, Integer>, StrategyPoint> myMap = new HashMap<Pair<Integer, Integer>, StrategyPoint>(); 

. 먼저 Key는 고유하지 않으며 동일한 값을 가진 Pair의 다른 인스턴스가 keySet에서 찾을 수 있습니다. 또한 contains key 함수는 내가 가정 한 방식대로 작동하지 않는다. 내가 뭔가를 분명히 놓친다면 Pair 클래스에서 내 인스턴스를 비교하는 방법을 어떻게 든 정의해야 할 가능성이 높습니다. 그러나 compareTo 내 쌍 클래스에서 구현하는 tryed 및 여전히 작동하지 않습니다. 어떤 제안?

원본 코드가 다소 엉망이며 읽고 쓸모 없기 때문에 여기에서 내 문제를 설명하기위한 예제를 만들었습니다.

HashMap<Pair<Integer, Integer>, StrategyPoint> myMap = new HashMap<Pair<Integer, Integer>, StrategyPoint>(); 
    Pair<Integer, Integer> myPair = new Pair<Integer, Integer>(2,2); 
    StrategyPoint myPoint= new StrategyPoint(2, 2, 5, 5, false); 
    myMap.put(myPair, myPoint); 


    Pair<Integer, Integer> searcher = new Pair<Integer, Integer> (0,0); 
    searcher.setFirst(2); 
    searcher.setSecond(2); 
    System.out.println(myMap.containsKey(searcher)); 
    System.out.println(myMap.containsKey(myPair)); 

수행 한 결과는 다음과 같습니다 :

거짓

사실

내가 디버그 자신과 수색자 인스턴스가 제대로 채워에 beeing되어 있습니다 그러나 그것이 HashMap에 보인다 여기에 코드입니다 그것의 KeySet에서 그것을 찾기를 거절한다.

도움 주셔서 감사합니다.

답변

12

Pair 클래스에는 equalshashCode을 올바르게 구현해야합니다.

HashMap은 이러한 방법을 사용하여 키 클래스를 구별하고 해시합니다.

+3

모든 Java 초보자는 조만간 또는 그 후에 equals/hashCode 문제에 직면하게 될 것입니다! – gd1

+0

나는 표준 문제를 알고 있었다. 감사합니다 그것을 시도 할 것이다!. –

+0

@ gd1 on point !!! –

2

귀하의 페어 클래스는 Object의 Javadoc에 지정된 계약에 따라 hashCode()equals()을 구현해야합니다.

5

Pair 클래스에서 equals을 덮어 써야합니다. 이 메소드의 구현은 Pair의 두 객체가 어떻게 같은 것으로 간주되는지 정의합니다.

equals을 덮어 쓸 때마다 항상 hashcode을 무시해야합니다. 여기

hashcodeequals을 무시하지만,하지 않을 때 잘못 될 수있는 것입니다 (유효 자바, 둘째 에드에서.) :

두 가지 경우가 있지만,에, 클래스의 이 동일 방법에 따라 논리적으로 동일 할 수있다 Object의 hashCode 메소드는 단지 두 개의 공통점이있는 객체입니다 ( ). 따라서 Object의 hashCode 메서드는 계약에서 요구하는대로 숫자 두 개가 아닌 두 개의 임의의 숫자를 반환합니다. 다른 컬렉션에있는 동안 하나를 검색하려고하면이 논리적으로 동일한 인스턴스에 대한 해시 코드는, 불평등 될 수 있기 때문에

, 당신은 null 결과 잘못된 해시 양동이에 찾고 끝날 것이다.

equals의 구현이 준수해야하는 rules 집합이 있습니다. hashcode을 재정의하기위한 rules의 또 다른 세트입니다.

+0

-1 : 답변이 늦었고 불완전합니다. 나머지 두 개는 이미 맞습니다. –

+4

늦은 것은별로 유용하지 않습니다. –

+1

downvote의 시점에서 hashCode를 완전히 잊어 버렸기 때문에 해답이 잘못되어 유용하지 않습니다. 기록을 다시 쓰지 마십시오. 나는 대답을 수정 했으므로 내 downvote를 제거했습니다. –

관련 문제