我们使用BiMap解决的问题

时间:2013-03-09 17:39:34

标签: java guava bimap

我正在审查Googles Guava API的功能,我遇到了一个我在“真实世界编程”体验中没有看到过的数据结构,即BiMap。对于给定值,这种构造的唯一好处是能够快速检索密钥吗?是否存在使用BiMap最佳表达解决方案的问题?

2 个答案:

答案 0 :(得分:8)

任何时候您希望能够进行反向查找而无需填充两个地图。例如,您希望按姓名查找电话号码的电话簿,但也希望进行反向查询以获取该号码的名称。

答案 1 :(得分:5)

路易斯提到BiMap实施中可能节省的内存。通过包装两个Map实例,这是唯一无法获得的。不过,如果您让我们为您Map包裹put(newKey, existingValue)个实例,we can take care of a few edges cases。 (你可以自己处理所有这些,但为什么要打扰?:))

  • 如果你打电话给forcePut,我们会立即报错,以保持两张地图同步,而不是在意识到它与另一张地图中的现有地图冲突之前将该条目添加到一张地图。 (如果您确实要覆盖现有值,我们会提供null。)我们为插入BiMap或其他无效值提供类似的保护措施。
  • entrySet 观看次数保持两张地图同步:如果您从原始BiMap的{​​{1}}中删除了某个元素,则其相应的条目也会被删除从逆。我们在Entry.setValue中做同样的事情。
  • 我们处理序列化:BiMap并且反向停留“已连接”,条目仅序列化一次。
  • 我们提供inverse()的智能实现,以便foo.inverse().inverse()返回foo,而不是包装器的包装。
  • 我们覆盖values()以返回Set。此设置与您从inverse().keySet()获得的设置相同,只是它保持与原始BiMap相同的迭代顺序。