2013-02-01 105 views
14

我有一些代碼與Map<String, Map<String, String>>對象,它的作品(它被實例化爲HashMap的HashMap),但我想知道是否有更好的方式來表示這個數據結構在番石榴。番石榴映射

我已經考慮過Multimap,但是在番石榴有ListMultimapSetMultimap,我沒有找到「MapMultimap」。

我也檢查了Table,這似乎更像它,但它的名字讓我感到不舒服:我擁有的絕對不是桌子,而是一棵樹。 (第二把鑰匙之間沒有重疊)

有更好的番石榴替代品還是應該堅持Map<String, Map<String, String>>

+1

內部'Map'的外觀如何?那麼用適當的類替換它,那麼你會有一個'Map '來代替? –

+0

@Philipp Reichart:那麼我的SomeObject需要有一個內部映射,所以我沒有看到我的代碼會變得如何簡單... – WannaKnow

+1

這就是爲什麼我問內部映射的外觀如何:如果它們都具有相同的鍵例如''firstName「',''lastName」',...),你可以用一個類的實例替換它們,比如'Person {String firstName;字符串lastName; ''。如果每個內部地圖都不同,這當然是行不通的。 –

回答

23

Table似乎非常適合您的需要。但請確保您選擇正確的實施。特別是,如果你的第二個鍵都是不同的(表中的列),結果表將會很稀疏,你應該考慮這個來管理內存使用情況。

所以你應該避免ArrayTable,但可以使用任何其他的實現。請注意,docs提到ImmutableTable已經爲稀疏和密集的數據集優化了實現。

如果您的Table是一次構建的,您可以使用ImmutableTable.Builder並受益於此優化,並且如果表在多個線程之間共享,則可以簡化您的生活。

12

看看番石榴的Table接口。

documentation例子似乎相當多的重疊與用例:

通常情況下,當你在一個 時間試圖指數上有多個按鍵,你會風與像地圖<名字, 地圖<姓氏,人物> >,這是醜陋和尷尬的使用。 Guava 提供了一種新的集合類型Table,它支持任何「行」類型和「列」類型的此用例 。