2013-02-01 2 views
14

나는 어떤 코드가 Map<String, Map<String, String>> 개체 (작동합니다 (HashMap의 HashMap로 인스턴스화되어 있음)가 있지만 구아바에서이 데이터 구조를 나타내는 더 좋은 방법이 있는지 궁금합니다.지도에서 구아

나는 구아바에 ListMultimapSetMultimap이 있지만 나는 "MapMultimap"을 발견하지 못했다.

나는 더 비슷하다고 생각되는 Table을 확인했지만, 그 이름은 나를 불편하게 만듭니다. 내가 가진 것은 분명히 나무가 아니라 나무입니다. (두 번째 키 사이에 겹침이 없음)

더 좋은 구아바 대체품이 있습니까? 아니면 Map<String, Map<String, String>>을 사용해야합니까?

+1

내부 '지도'는 어떻게 보이나요? 적절한 클래스로 대체하면,'Map '를 대신 가질 수 있을까요? –

+0

@Philipp Reichart : 그럼 내 SomeObject는 내부 맵을 가져야하므로 내 코드가 어떻게 더 단순 해지는 지 알지 못합니다 ... – WannaKnow

+1

그래서 내부 맵이 어떻게 보이는지 묻는 이유는 다음과 같습니다. 모든 키가 동일한 경우 예를 들어''firstName "',''lastName'', ...), 당신은'Person {String firstName; String lastName; ...}'. 모든 내부 맵이 다른 경우이 물론 작동하지 않습니다. –

답변

23

Table은 사용자에게 적합합니다. 그러나 적절한 구현을 선택했는지 확인하십시오. 특히, 두 번째 키가 모두 고유 한 경우 (테이블의 열) 결과 테이블이 희박하므로 메모리 사용을 관리하기 위해 고려해야합니다.

그래서 ArrayTable을 피하고 다른 구현체를 사용할 수 있습니다. docsImmutableTable에 대해 더 까다 롭고 밀도가 높은 데이터 세트에 대한 구현이 최적화되어 있다고 언급합니다.

Table을 한꺼번에 구성한 경우 ImmutableTable.Builder을 사용할 수 있으며이 최적화를 통해 이익을 얻을 수있을뿐만 아니라 테이블이 여러 스레드간에 공유되는 경우 수명을 단축 할 수 있습니다.

12

Guava의 Table 인터페이스를 살펴보십시오.

일반적으로

, 당신은 한 번에 두 개 이상의 키에 인덱스하려고 할 때, 당신은 같은과 바람됩니다

documentation 예는 사용 사례와 꽤 겹쳐 보인다 지도 < 이름, 지도 < 성, 사람 > >, 사용하기에는 추악하고 어색합니다. Guava 은 "행"유형 및 "열"유형에 대해이 유스 케이스 을 지원하는 새로운 수집 유형 인 테이블을 제공합니다.