2013-02-01 19 views
14

Ho un codice con gli oggetti Map<String, Map<String, String>>, che funziona (viene istanziato come HashMap di HashMaps), ma mi chiedo se esiste un modo migliore per rappresentare questa struttura dati in Guava.Mappa in Mappa in Guava

Ho considerato Multimap, ma mentre ci sono ListMultimap e SetMultimap in Guava, non ho trovato nessun "MapMultimap".

Ho anche controllato Table, che sembra essere più simile, ma il suo nome mi sta mettendo a disagio: quello che ho non è sicuramente un tavolo ma un albero. (Non c'è sovrapposizione tra i secondi tasti)

C'è un'alternativa Guava migliore o dovrei rimanere con Map<String, Map<String, String>>?

+1

Come appare la "mappa" interna? Che ne dici di sostituirlo con una classe appropriata, quindi dovresti avere un 'Map '? –

+0

@Philipp Reichart: Quindi il mio SomeObject deve avere una mappa interna, quindi non vedo come il mio codice diventerebbe più semplice ... – WannaKnow

+1

Ecco perché ho chiesto come appare la mappa interna: Se hanno tutti gli stessi tasti (es. '" firstName "', '" lastName "', ...), puoi sostituirli con istanze di una classe come 'Person {String firstName; String lastname; ...} '. Se ogni mappa interna è diversa, ovviamente non funzionerà. –

risposta

23

Table sembra adatto per le vostre esigenze. Ma assicurati di scegliere l'implementazione corretta. In particolare, se le tue second keys sono tutte distinte (le colonne nella tabella) la tabella risultante sarà sparsa e dovresti tenerne conto per gestire l'utilizzo della memoria.

Quindi è necessario evitare la tabella di array, ma è possibile utilizzare qualsiasi altra implementazione. Si noti che lo docs menziona che ImmutableTable ha implementazioni ottimizzate per set di dati più spessi e più densi.

Se il Table è costruito in una sola volta, è possibile utilizzare un ImmutableTable.Builder e beneficiare di questa ottimizzazione, nonché semplificare la vita se la tabella è condivisa tra più thread.

12

Dai un'occhiata all'interfaccia Table di Guava.

sua documentation esempio sembra sovrapporsi un po 'con il vostro caso d'uso:

In genere, quando si sta cercando di indicizzare su più di un tasto alla volta , sarà vento con qualcosa di simile Mappa < FirstName, Mappa < LastName, Persona > >, che è brutto e scomodo da utilizzare. Guava fornisce un nuovo tipo di raccolta, Tabella, che supporta questo caso d'uso per qualsiasi tipo di "riga" e tipo "colonna".