【问题标题】:Map in Map in Guava番石榴地图中的地图
【发布时间】:2013-01-16 17:16:25
【问题描述】:

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

我考虑过Multimap,但是虽然Guava 中有ListMultimapSetMultimap,但我没有找到“MapMultimap”。

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

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

【问题讨论】:

  • 内部Map 长什么样子?用适当的类替换它怎么样,所以你会有一个Map<String, SomeObject> 代替?
  • @Philipp Reichart:那么我的 SomeObject 需要有一个内部 Map,所以我看不出我的代码会如何变得更简单......
  • 这就是为什么我问内部 Maps 的样子:如果它们都具有相同的键(例如 "firstName""lastName"、...),您可以将它们替换为类的实例喜欢Person { String firstName; String lastName; ... }。如果每个内部 Map 都不一样,这当然行不通。
  • @Philipp Reichart:我明白了。内部地图不同且不相关。

标签: java data-structures collections guava


【解决方案1】:

看看 Guava 的Table 接口。

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

通常,当您尝试索引多个键时 时间,你会得到类似 Map>,丑陋且难用。番石榴 提供了一个新的集合类型 Table,它支持这个用例 对于任何“行”类型和“列”类型。

【讨论】:

    【解决方案2】:

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

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

    如果您的Table 是一次构建的,您可以使用ImmutableTable.Builder 并从这种优化中受益,并且如果表在多个线程之间共享,您的工作也会变得更简单。

    【讨论】:

    • 我有一个类似的用例,只是上面多了一步。它的 Map> 对表和多图组合类型的用例有什么建议吗?
    • 我不确定,你可以问一个单独的问题。
    猜你喜欢
    • 1970-01-01
    • 2012-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-22
    • 1970-01-01
    • 2015-04-29
    • 1970-01-01
    相关资源
    最近更新 更多