2009-09-01 3 views
2

Guava의 ArrayListMultimap<K,V> 컬렉션을 사용하여 IntegersStrings에 매핑합니다. 이 클래스는 containsValue(Object value)이라는 메서드를 제공합니다.이 메서드는 Multimap에 임의의 키에 대해 지정된 값이 포함되어 있는지 확인합니다. 그것이 사실이라고 판단되면, 상기 키를 검색하는 가장 좋은 방법은 무엇입니까? 대신 모든 키 - 값 쌍의 컬렉션을 반환 myMap.entries()을 반복 할 수 containsValue을 사용ArrayListMultimap 키 가져 오기

ArrayListMultimap<String, Integer> myMap = ArrayListMultimap.create(); 

if (myMap.containsValue(new Integer(1)) 
{ 
    // retrieve the key? 
} 

답변

3

. 당신이 그렇게지도의 가치를 통해 containsValue 그것은 단지 반복의 구현을 보면

Integer toFind = new Integer(1); 
for (Map.Entry<String, Integer> entry: myMap.entries()) { 
    if (toFind.equals(entry.getValue())) { 
     // entry.getKey() is the first match 
    } 
} 
// handle not found case 

: 반환 수집에 의해 생성 된 반복자는 두 번째 키의 값 다음에 하나의 키 값, 등을 통과 map.values() 대신 map.entries()으로 수행하는 성능은 거의 같아야합니다. 당신이 당신의지도에 각 값은 하나의 키에 대해 발생하는 것을 알지 못한다면 당신은 예를 동작을 지정해야합니다, 그래서 물론 일반적인 경우

public boolean containsValue(@Nullable Object value) { 
    for (Collection<V> collection : map.values()) { 
     if (collection.contains(value)) { 
     return true; 
     } 
    } 

    return false; 
} 

반드시 주어진 값에 대한 고유 키가없는 첫 번째 키 또는 마지막 키를 원한다면