我正在审查 Google 的 Guava API 的功能,并且遇到了我在“真实世界编程”体验中没有使用过的数据结构,即 BiMap。这种构造的唯一好处是能够快速检索给定值的键吗?是否存在使用 BiMap 最好地表达解决方案的任何问题?
问问题
1025 次
2 回答
9
任何时候您都希望能够进行反向查找而无需填充两个地图。例如一个电话目录,您希望按名称查找电话号码,但也希望进行反向查找以从号码中获取名称。
于 2013-03-09T17:42:54.447 回答
5
Louis 提到了在实现中可能节省的内存BiMap
。Map
这是包装两个实例无法获得的唯一东西。不过,如果您让我们Map
为您包装实例,我们可以处理一些边缘情况。(你可以自己处理所有这些,但为什么要麻烦呢?:))
- 如果您调用
put(newKey, existingValue)
,我们将立即出错以使两个映射保持同步,而不是在意识到它与另一个映射中的现有映射冲突之前将条目添加到一个映射。(forcePut
如果您确实想要覆盖现有值,我们会提供。)我们为插入null
或其他无效值提供类似的保护措施。 BiMap
视图使两个映射保持同步:如果从entrySet
原始 的 中删除一个元素BiMap
,则其对应的条目也会从反向中删除。我们在Entry.setValue
.- 我们处理序列化:A
BiMap
和它的逆保持“连接”,并且条目只被序列化一次。 - 我们提供了一个智能实现,
inverse()
以便foo.inverse().inverse()
返回foo
,而不是包装器的包装器。 - 我们重写
values()
以返回一个Set
. 这个集合与你得到的集合相同,inverse().keySet()
只是它保持与原始集合相同的迭代顺序BiMap
。
于 2013-03-11T14:57:49.233 回答