2012-07-20 49 views
15

我需要爲Guava Multimap添加一個鍵值爲空的集合作爲值。我該如何做到這一點?將一個空值的鍵值添加到Guava Multimap中

我嘗試這樣做:

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

但調用get()返回一個列表的一個元素,它是空的。我工作圍繞這通過執行以下操作:

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

但我不知道如果這是一個糟糕的事是什麼?我知道Guava會在刪除最後一個值時自動刪除一個鍵,以保持containsKey()的一致性。這裏我最好的選擇是什麼?

+2

您如何告訴我們*爲什麼*您覺得您需要使Multimap的行爲方式不符合預期? – 2012-07-20 22:57:13

+4

這只是數據的性質。我有一套鑰匙,其中一些鑰匙有與他們相關的價值,還有一些鑰匙沒有。 (實際的鍵/值來自數據庫)。如果這對於Multimap來說是一個糟糕的用例,那很好,我可以接受其他解決方案。此代碼中的原始impl使用了Map >,並且切換到Multimap似乎很自然。 – 2012-07-20 23:13:42

回答

23

Multimap故意禁止這種方法,並且您提議的解決方法是禁用 - 它實際上不會執行任何操作。

Multimap的工作方式是,multimap.get(key)永遠不會返回null,但總是返回一些集合 - 可能是空的。 (但後盾Multimap實現可能實際上並不存儲任何該鍵,如果鍵沒有映射到一個非空收集,也不會如出現在keySet()Multimap is not a Map<K, Collection<V>>

如果你想映射到一個空的集合,你必須使用Map<K, List<V>>

8

由於javadoc涵蓋,multimap概念上是一串鍵值對,其中鍵不一定是唯一的,例如a = 1,a = 2,b = 3。如果沒有與a關聯的值,那麼a沒有鍵 - 值對,所以a在multimap中不存在。

您可以做的一件事是爲您關心的整個密鑰世界單獨保留一個Set<K>,或者只保留沒有值對應的其他密鑰。另一種方法是使用Map<K, Collection<V>>Map<K, Something>,其中Something包含可能也可能不是空的集合。