2013-03-09 2 views
2

Google Goava API의 기능을 검토 중이며 '실제 프로그래밍'경험에서 사용하지 않은 데이터 구조, 즉 BiMap을 사용했습니다. 주어진 값에 대해이 키를 빠르게 검색 할 수있는 유일한 이점이 있습니까? BiMap을 사용하여 솔루션을 가장 잘 표현할 수있는 문제가 있습니까?우리가 해결하기 위해 BiMap을 사용하는 문제

답변

8

언제든지 두 개의 맵을 채우지 않고 역방향 조회를 수행 할 수 있기를 원할 때. 예를 들어 이름으로 전화 번호를 조회하고자하는 전화 번호부에서 번호를 가져 오기 위해 역방향 조회를 수행하고 싶습니다.

+0

어떻게이 작업을 두 개의 맵없이 수행 할 수 있습니까? 확실히 BiMap은 두 개의지도를 사용해야하며이 사실을 그냥 숨겨야합니까? –

+2

네, 아마도 두 개의 맵을 사용하지만, 두 개의 맵을 채우고 관리하지 않아도됩니다. – digitaljoel

+2

@ digitaljoel : 아마도 그렇지 않습니다. [출처] (https://code.google.com/r/baggiogamp-guava/source/browse/guava/src/com/google/common/collect/AbstractBiMap.java?r=4fbef9f220a86423f6ebc131c06bac5c3bb5e731) – jlordo

5

루이는 BiMap 구현에서 가능한 메모리 절약을 언급했습니다. 두 개의 Map 인스턴스를 래핑하면 얻을 수없는 유일한 방법입니다. 그래도 Map 인스턴스를 포장하면 we can take care of a few edges cases입니다. (당신이 처리하는 모든 자신을, 그런데 왜 귀찮게 수 있을까? :))

  • 당신이 put(newKey, existingValue)를 호출 할 경우, 우리는 오히려 실현하기 전에 하나 개의 맵에 항목을 추가하는 대신, 동기화 두 개의 맵을 유지하기 위해 즉시 오류가 있습니다 다른 매핑이 기존 매핑과 충돌합니다. 기존 값을 덮어 쓰려면 forcePut을 제공하십시오. null 또는 다른 잘못된 값을 삽입하는 것과 유사한 안전 장치를 제공합니다.
  • BiMap뷰 동기화에 두 개의 맵을 유지 : 원래 BiMapentrySet에서 요소를 제거하는 경우, 해당 항목은 역에서 제거됩니다. 우리는 Entry.setValue에서 같은 종류의 일을합니다.
  • 우리는 직렬화를 처리합니다 : BiMap 및 그 반대 상태가 "연결됨"이며 항목이 한 번만 직렬화됩니다.
  • 우리는 inverse()의 스마트 구현을 제공하므로 foo.inverse().inverse()은 래퍼의 래퍼가 아닌 foo을 반환합니다.
  • Set을 반환하려면 values()을 다시 지정하십시오. 이 세트는 원래 BiMap과 동일한 반복 순서를 유지한다는 점을 제외하면 inverse().keySet()에서 얻은 것과 동일합니다.
관련 문제