我们使用BiMap解决的问题

Ami*_*ani 2 java bimap guava

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

dig*_*oel 8

任何时候你想要能够进行反向查找而不必填充两个地图.例如,您希望按名称查找电话号码的电话目录,但也希望进行反向查找以从号码中获取名称.

  • @jlordo,@ AmirAfghani:这是旧版番石榴的克隆.当前实现的`HashBiMap` [没有这样的东西](https://code.google.com/p/guava-libraries/source/browse/guava/src/com/google/common/collect/HashBiMap.java) ,节省[传统的`HashMap对内存的近40%](https://code.google.com/p/guava-libraries/source/detail?r=72a25f66b25db2c957bf8f287c2e54baf418d514).(`ImmutableBiMap`类似.) (10认同)
  • 是的,它可能确实使用了两张地图,但是您不必填充两张地图并管理所有这些地图. (2认同)
  • @digitaljoel:不太可能,确实如此.请参阅[来源](https://code.google.com/r/baggiogamp-guava/source/browse/guava/src/com/google/common/collect/AbstractBiMap.java?r=4fbef9f220a86423f6ebc131c06bac5c3bb5e731) (2认同)
  • 别担心.("HashBiMap"的重写也是超级近期,仅在一周或两周前与Guava 14一起发布.而且,我是那个重写它的人,所以我对这些事情特别感兴趣.) (2认同)

Chr*_*irk 5

路易斯提到了BiMap实施中可能节省的内存.这是你通过包装两个Map实例唯一不能得到的东西.不过,如果你让我们Map为你包装实例,我们可以处理一些边缘情况.(你可以自己处理所有这些,但为什么要打扰?:))

  • 如果你打电话put(newKey, existingValue),我们会立即报错,以保持两张地图同步,而不是在意识到它与另一张地图中的现有地图冲突之前将条目添加到一张地图.(forcePut如果您确实要覆盖现有值,我们会提供.)我们为插入null或其他无效值提供类似的安全措施.
  • BiMap 视图使两个映射保持同步:如果从entrySet原始映射中删除元素BiMap,则其相应的条目也将从反向中删除.我们做同样的事情Entry.setValue.
  • 我们处理序列化:A BiMap和它的反向保持"连接",并且条目只被序列化一次.
  • 我们提供了一个智能实现,inverse()以便foo.inverse().inverse()返回foo,而不是包装器的包装器.
  • 我们覆盖values()以返回a Set.inverse().keySet()除了保持与原始迭代顺序相同的迭代顺序外,此集与您获得的集相同BiMap.