2013-02-01 103 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,它支持任何“行”类型和“列”类型的此用例 。