2010-12-10 6 views
1

다음과 같은 코드가 있습니다 :containsKey가 키를 찾지 못한 이유는 무엇입니까?

payoffs2exchanges.put(point, exchange); 
if (!payoffs2exchanges.containsKey(point)) { 
    game.log.fine("yes"); 
} else { 
    game.log.fine("no"); 
} 

"no"를 출력합니다. 즉, 키 - 값 쌍을 맵에 추가 한 다음 바로 그 키가 존재하는지 확인하고 존재하지 않는다는 것을 확인합니다. 왜?

여전히 키에 문제가 있습니다. 다음 코드는 키를 추가 할 때마다 새 키를 추가한다고 말합니다. 그리고 나는 그렇지 않다는 것을 안다.

  Integer[] point = new Integer[2]; 
     point[0] = proposerBestScore; 
     point[1] = responderBestScore; 
     game.log.fine("In the getCloudOfPayoffs: found payoffs:" + point[0] + "," + point[1] + ". Exchange: " + exchange[0]+","+exchange[1]+","+exchange[2]+","+exchange[3]+","+exchange[4]); 
     // With the following block we ensure that every options (pair of payoffs) is represented by exchange with minimal number of moves. 
     if (!payoffs2exchanges.containsKey(point)) { 
      payoffs2exchanges.put(point, exchange); 
      game.log.fine("In the getCloudOfPayoffs: this option is new. We add it to the map."); 
     } else { 
      game.log.fine("In the getCloudOfPayoffs: this option is old."); 
      Integer[] exchangeFromMap = payoffs2exchanges.get(point); 
      Integer newSum = 0; 
      Integer oldSum = 0; 
      for (int i=0;i<Design.nColors;i++) { 
       newSum = newSum + Math.abs(exchange[i]); 
       oldSum = oldSum + Math.abs(exchangeFromMap[i]); 
      } 
      if (newSum<oldSum) { 
       game.log.fine("In the getCloudOfPayoffs: the new exchange is better than the old one."); 
       payoffs2exchanges.put(point, exchange); 
      } 
     } 
+0

'point' 클래스는 무엇입니까? 사용자 정의 클래스? 어떤 클래스가'payoffs2exchanges'입니까? –

+0

업데이트를 해결하는 답변이 추가되었습니다. – aioobe

+0

@aioobe, 질문에 대한 이러한 조작에 대해 사과드립니다. 나는 그것을 돌려 놓았다. 그래서 대답은 유용합니다. – Roman

답변

6

. Java 배열은 예상대로 equalshashCode을 구현하지 않기 때문에 나쁜 것입니다.이 예제를 참조하십시오 : 내 컴퓨터에서

public class Test { 
    public static void main(String[] args) { 
     Integer[] arr1 = { 1, 2 }; 
     Integer[] arr2 = { 1, 2 }; 

     System.out.println(arr1.equals(arr2)); 
     System.out.println(arr1.hashCode() + "/" + arr2.hashCode()); 
    } 
} 

를가 인쇄 :

false 
1476323068/535746438 

나의 추천 제대로 재정의하는 사용자 정의 Point 클래스를 만드는 것입니다 equalshashCode (또는 가능 java.awt.Point를 다시 사용하면 차종이라고 생각하면 감각).

+0

정수 배열을 키로 사용하면 containsKey가 작동하지 않습니다. – Roman

+0

예, 정확하게. 지도는 일반적으로'equals' 메쏘드에 많이 의존하며,'HashMap'과 같은 경우에는'hashCode'도 중요합니다. – aioobe

+0

키가 정수 배열 인 경우 여전히'somHashMap.get (key)'를 사용할 수 있습니까? – Roman

6

그것은 은 옳은 일을하고입니다. containsKeytrue이면 ! 연산자가 false으로 무효화되므로 no (else 절)을 출력합니다. 코드 :지도가 실제로 키가 포함되어있는 경우가 no를 인쇄에서

+0

감사! 그것은 어리석은 질문이었다. – Roman

+0

환영합니다. 부주의 한 실수였던 것 같아요. – lijie

0

봐 ... 당신은지도에서 키와 같은 Integer[]을 사용하고