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