2013-02-01 15 views
14

Mam pewien kod z obiektami Map<String, Map<String, String>>, który działa (jest tworzony jako HashMap z HashMaps), ale zastanawiam się, czy istnieje lepszy sposób przedstawienia tej struktury danych w Guava.Mapa na mapie w Guava

Rozważałem Multimap, ale podczas gdy istnieje ListMultimap i SetMultimap w Guava, nie znalazłem "MapMultimap".

Sprawdziłem również Table, która wydaje się bardziej podobna, ale jej nazwa sprawia, że ​​czuję się niekomfortowo: to, co mam, to zdecydowanie nie stół, ale drzewo. (Nie ma nakładania się między drugimi klawiszami)

Czy jest lepsza alternatywa dla Guawy, czy też powinienem trzymać się z Map<String, Map<String, String>>?

+1

Jak wygląda wewnętrzna mapa? Co powiesz na zastąpienie go odpowiednią klasą, więc zamiast tego będziesz miał 'Map '? –

+0

@Philipp Reichart: Wtedy mój SomeObject musi mieć wewnętrzną mapę, więc nie widzę, jak mój kod stałby się prostszy ... – WannaKnow

+1

Dlatego zapytałem, jak wyglądają wewnętrzne mapy: jeśli wszystkie mają te same klucze (np. '" firstName "', '" lastName "', ...), możesz zastąpić je instancjami klasy typu 'Person {String firstName; String lastName; ...} '. Jeśli każda mapa wewnętrzna jest inna, to oczywiście nie będzie działać. –

Odpowiedz

23

Table wydaje się dobrze pasować do Twoich potrzeb. Ale upewnij się, że wybierasz właściwą implementację. W szczególności, jeśli wszystkie drugie klucze są różne (kolumny w tabeli), wynikowa tabela będzie rozrzedzona i należy wziąć to pod uwagę, aby zarządzać wykorzystaniem pamięci.

Należy więc unikać tabeli Array, ale można użyć dowolnej innej implementacji. Zauważ, że docs wspomina, że ​​ImmutableTable ma zoptymalizowane implementacje dla sparser i gęstszych zestawów danych.

Jeśli twoja Table jest zbudowana od razu, możesz użyć i skorzystać z tej optymalizacji, a także uprościć życie, jeśli tabela jest współdzielona przez kilka wątków.

12

Spójrz na interfejs Guava Table.

Jego documentation przykładem wydaje się pokrywać trochę z korzystaniem literami:

Zazwyczaj, gdy starasz się indeksu na więcej niż jeden klucz w czasie, będzie można skończyć z czymś Mapa < FirstName, Mapa < LastName, Person > >, która jest brzydka i niewygodna w użyciu. Guava udostępnia nowy typ kolekcji, tabela, która obsługuje ten przypadek użycia dla dowolnego typu "wiersza" i typu "kolumna".