15

我有一些带有Map<String, Map<String, String>>对象的代码,它可以工作(它被实例化为 HashMaps 的 HashMap),但我想知道在 Guava 中是否有更好的方法来表示这个数据结构。

我已经考虑过Multimap,但是在 Guava 中有ListMultimapSetMultimap时,我发现没有“MapMultimap”。

我也查了Table,看起来更像它,但它的名字让我很不舒服:我拥有的绝对不是一张桌子,而是一棵树。(第二个键之间没有重叠)

有更好的番石榴替代品还是我应该坚持使用Map<String, Map<String, String>>

4

2 回答 2

23

Table似乎很适合您的需要。但请确保您选择了正确的实现。特别是,如果您的第二个键都是不同的(表中的列),则生成的表将是稀疏的,您应该考虑到这一点来管理内存使用情况。

因此,您应该避免使用 ArrayTable,但可以使用任何其他实现。请注意,文档中提到了ImmutableTable针对稀疏和密集数据集的优化实现。

如果您Table是一次构建的,您可以使用ImmutableTable.Builder并从这种优化中受益,并且如果表在多个线程之间共享,则可以简化您的生活。

于 2013-02-01T11:53:09.277 回答
11

看一下 Guava 的Table界面。

它的文档示例似乎与您的用例有很多重叠:

通常,当您尝试一次对多个键进行索引时,您最终会得到类似 Map<FirstName, Map<LastName, Person>> 的东西,这很难用且难以使用。Guava 提供了一种新的集合类型 Table,它支持任何“行”类型和“列”类型的这种用例。

于 2013-02-01T11:47:44.297 回答