2013-08-07 19 views
4

의 TreeMap을 반복하고 .containsKey == false을 가져 오는 이유는 무엇입니까?Java TreeMap에 키가 포함되어 있지만 containsKey 호출에서 false가 반환됩니다 (키가 변경되지 않은 동일한 객체 일지라도)

많은 반복 후에 많은 반복과 호출이 발생합니다. map.get(thisObject)null을 반환합니다. 그러나 디버그는 키 (동일한 참조, 값 및 해시)와 실제 값이 맵에 있음을 보여줍니다.@rgettman 추측으로

가 다른로 구성 되었기 때문에 일종의 Comparator는 트리 맵의 구축시에 사용하는 사용자 정의는 (그것을 보지 않았다 프로그래머 :지도는 작은 (25 개 요소) TreeMap<Long, Double>

이 업데이트입니다 수업). 이 비교기 (내 생각) 변경 here

에서 붙여 복사 불과했다 Comparator :

public int compare(Object a, Object b) { 

    if((Double)base.get(a) > (Double)base.get(b)) { 
     return 1; 
    } else if((Double)base.get(a) == (Double)base.get(b)) { 
     return 0; 
    } else { 
     return -1; 
    } 
    } 

수정 문제

... 
    } else if(base.get(a).equals(base.get(b))) { 
     return 0; 
... 

합니다. 이 문제가 수백만 건의 작업 직후에 나타나는 이유는 두 개의 서로 다른 키에 대해 두 개의 유사한 값이있는 경우가 없었기 때문입니다. 문맥에서는 그렇지 않을 수 있습니다.

그래서에서 :

25151l, 1.7583805400614032 
24827l, 1.7583805400614032 

실패합니다.

도움 주셔서 감사합니다.

+1

==를 .equals로 변경해보십시오. –

+0

@RameshK 내 말은 OP가 이미 동일한 심판임을 확인했기 때문에 '=='에 문제가 없어야합니까? –

+0

실패한 주요 값은 무엇입니까? – rgettman

답변

0

방금 ​​코드를 실행했는데 이 내게을 반환했습니다.

  TreeMap<Long,Double> otm = new TreeMap<Long, Double>(); 
      otm.put(1L, 1.0); 
      otm.put(2L, 2.0); 

     for (Object thisObject : otm.keySet()) { 
       System.out.println(otm.containsKey(thisObject)); 
     }  

입력 한 데이터를 TreeMap에 제공 할 수 있습니까? 감사합니다

이있는 containKey (개체 키)의 JavaDoc에서 구현

containsKey

부울 containsKey (개체 키)가 true

반환이지도의 매핑이 포함되어있는 경우에 지정된 키

더 공식적으로,이 맵이 키 K에 대한 매핑 있는 경우에만 true를 반환 등, 그 (키 == 널 K == 널 (null) : key.equals (K)). ( 은 최대 하나의 그러한 매핑 일 수 있습니다.)

매개 변수 : 도움이

key - key whose presence in this map is to be tested Returns: 
true if this map contains a mapping for the specified key Throws: 
ClassCastException - if the key is of an inappropriate type for this map (optional) 
NullPointerException - if the specified key is null and this map does not permit null keys (optional 

희망.

+1

예를 들어 OP에 추가 된 특정 쌍에 문제가있는 경우 어떻게합니까? 요점은 OP *가 사실을 돌려줘야한다는 것을 알고 있지만 그의 특별한 경우가 아닌 이유를 알고 싶어한다는 것입니다. 다른 임의의 경우를 시도해도 질문에 전혀 답할 수 없습니다. –

+0

@DennisMeng 나는이 특정 쌍에 대해 배우는 것이 궁금합니다. OP가 제대로 구현하지 못했다는 것이 었습니다. 그게 내가 왜 특정한 사건을보고 싶었던가. 그런 경우를 보았습니까? 만약 그렇다면, 저도 그 사실을 알려 주시면 고맙겠습니다. – JNL

+0

나는 추측하지만 "x 실수를하지 않았다"는 것과 "이 다른 사례를 시도하고 나에게 잘 맞았습니다"사이의 차이점이 있습니다. –

0

백킹 entrySet()/Map.Entry을 변경해야 키 순서가 변경되어 검색에 실패했습니다 containsKey.

0

대부분의 구현 클래스는 hashCode()와 equals()를 지원하고 올바르게 사용합니다.

개체와 실제로 동일한 해시 코드를 사용하는 경우 같음을 시도하십시오. 내게 제안 된 대답은 그들이 일치하지 않는다는 것입니다.

그렇지 않으면 개체 및/또는 각각의 해시 코드 및 같음 메서드를 게시 할 수있을만큼 시나리오가 작아야합니다.

+0

Long의 해시 코드는 그 값을 기반으로합니다. 'public int hashCode() { return (int) (value^(value >>> 32)); }' – user2661619