2012-07-20 11 views
15

Ho bisogno di aggiungere una chiave a un Guava Multimap con una raccolta vuota come valore. Come posso realizzare questo?Aggiunta di una chiave con un valore vuoto a Guava Multimap

ho provato questo:

map.put("my key", null); 

ma chiamare get() restituisce una lista con un elemento, che è nullo. Ho lavorato su questo facendo il seguente:

map.putAll("my key2", new ArrayList()) 

ma mi chiedo se questa è una brutta cosa da fare? So che Guava rimuove automaticamente una chiave quando viene rimosso l'ultimo valore per mantenere containsKey() coerente. Qual è la mia migliore opzione qui?

+2

Che ne dici di dirci * perché * pensi di dover fare un comportamento Multimap in un modo che non era previsto? –

+4

È solo la natura dei dati. Ho un set di chiavi, alcune delle quali hanno dei valori associati, e altre no. (Le chiavi/i valori effettivi provengono da un DB). Se questo è un caso di uso errato per Multimap, va bene, sono aperto ad altre soluzioni. L'impl originale in questo codice utilizzava una mappa > e il passaggio a Multimap sembrava naturale. –

risposta

23

Multimapdeliberatamente proibisce questo approccio e la soluzione proposta non è un'opzione, in realtà non farà nulla.

Il modo in cui lo Multimap funziona è che multimap.get(key) non restituisce mai nulla, ma restituisce sempre qualche raccolta, probabilmente vuota. (Ma l'attuazione supporto Multimap probabilmente in realtà non memorizzare qualsiasi cosa per quella chiave, e se la chiave non è associata a una non vuoto raccolta, ad esempio, non comparirà nella keySet(). Multimap is not a Map<K, Collection<V>>.)

Se si desidera mappare a una raccolta vuota, è necessario utilizzare Map<K, List<V>>.

8

Come le copertine javadoc, un multimap è concettualmente un insieme di coppie chiave-valore in cui le chiavi non sono necessariamente univoche, ad esempio a = 1, a = 2, b = 3. Se non ci sono valori associati a, allora non ci sono coppie chiave-valore per a, quindi a non esiste nella multimap.

Una cosa che puoi fare è mantenere uno Set<K> separato per l'intero universo di chiavi che ti interessa, o semplicemente per mantenere le chiavi aggiuntive che non corrispondono a nessun valore. Un altro è usare uno Map<K, Collection<V>>, o uno Map<K, Something> dove Something contiene una raccolta che potrebbe o meno essere vuota.