2010-03-29 3 views
8

HashMap이 있는데 정수 값으로 항목을 가져와야합니다. containsValue() 함수가 있음을 알았지 만 올바른 인덱스를 찾으려면 맵을 반복해야합니다.HashMap.containsValue - 중요한 점은 무엇입니까?

내 질문은; 나중에 그것을 통과해야하는 경우 containsValue()를 사용합니까?

또한 나는 완전히 그 지점을 놓치고 있습니까? ;-)

답변

7

지도는 키를 값에 매핑합니다. 가치가 있고 맵에이 값이 포함되어 있다는 것을 알고 있다면 왜 더 이상 키가 필요합니까?당신이 정말로 키가 필요하거나 가치의 단지 재산이있는 경우가 발견되면

한편

, 당신은 entrySet()을 반복 값을 확인하고 키를 반환 할 수 있습니다

for (Map.Entry<Index,Value> entry : map.entrySet()) { 
    if (entry.getValue().getXy().equals(xy)) { 
    return entry.getKey(); 
    } 
} 
5

지도는 에서 값 저장소의 키입니다. 값이 있다고 말하는 것은 지시로서 만 주어진다. 나는 당신이 값에서 키를 검색 할 수있게하는 전체적인 링크를 가지려면 google-collections의 BiMap 같은 것을 의지해야합니다.

1

트래버스 할 필요가없는 경우 containsValue()를 사용할 수 있습니다. 해시 맵에 키 - 값 쌍을 추가하려는 경우, 예를 들어 그 값이 hashmap에 있는지 알고 싶으면 전체 해시 맵을 추가합니다. 이 경우 추가 작업을 위해 전체 해시 맵을 탐색 할 필요가 없습니다.

+2

containsValue()는 HashMap을 탐색합니다. http://www.docjar.com/html/api/java/util/HashMap.java.html#631 값이지도에 있는지 여부를 알고 싶다면 ,이 정보는 별도의 세트에 보관해야합니다. –

+0

네,하지만 그의 질문은 "containsValue()를 사용하면 나중에 그것을 트래버스해야하는 이유는 무엇입니까?" 그래서 나는 그가 두 번째 시간 동안 hashmap을 트래버스해야 할 필요가 있다면 containsValue가 좋은 이유를 번역했다. – sanjuro

2

나중에 트래버스하지 않아도됩니다. containsValue()은 가치가있는 곳을 정확히 알 필요가없는 상황에서 유용하지만지도에 이미 있는지 만 알아야하는 경우에 유용합니다. 맵에서 값의 위치를 ​​정확하게 알아야하는 상황에서는 containsValue()을 사용하여 귀찮게하지 마십시오. 바로 반복기로 바로 이동하여 찾으십시오.

3

HashMap (또는 일반적으로 Map)은 키/값 쌍을 사용합니다. 맵에 무언가를 추가 할 때는 반드시 키를 지정해야하며 나중에 값을 검색 할 때 다시 사용되는 키입니다. HashMap의 구현에 기반 해, 키가 주어지면 값의 검색은 O (1) 시간에 완료됩니다.

containsValue는 찾고있는 값이 HashMap에 포함되어 있는지 확인하는 데 유용한 방법이지만 찾고있는 값을 검색하는 데 사용하는 이유를 실제로 볼 수 없습니다. ??

뭔가처럼 될지도를 사용하는 correft 방법 :

Object myObject = myMap.get(1); 

당신이 한 경우 :

myMap.containsValue 당신이 수행하여 객체를 얻을 수있는 지금

HashMap<Integer, Object> myMap = new HashMap<Integer, Object>(); 
myMap.put(1, object1); 
myMap.put(2, object2); 
myMap.put(3, object3); 

(1);

1은 값이 아니라 키이므로 false를 반환합니다. 당신은 할 수 :

myMap.containsKey(1); 

그냥 존재하는 경우 알고 싶어하지만, 문제는 호출에 존재하지 않는 경우 : 99

아무 키도 없었다 경우

Object myObject = myMap.get(99); 

그냥 null을 반환

기본적으로 요점은, 당신이 정확하다는 것입니다. 값을 검색하려고 할 때 containsValue를 사용할 필요가 없습니다. 먼저 존재 여부를 확인하려면 get 또는 containsKey를 사용하십시오.

0

것은 나를 보자

음, containsValue(), 내부적으로 (입력 매개 변수) hashmap의 모든 "값"과 비교합니까? 아니면 어떻게 든 hashcodeing (또는 다른 기술) 결과를 생성하는 데 사용합니까? 전자의 경우 단순히 반복자를 사용하여 값의 존재를 모든 해시 맵의 "값"과 비교하고 일치시킬 수 있습니다. 질문의 중요성은 성능 또는 속도입니다!

+0

이 경우 리샘플링이 어떻게 도움이되는지 나는 알 수 없습니다. – andrel

+0

이전 답변은 문맥에 어긋납니다. –

관련 문제