Apache Commons Collections Bidimap 简介
1. 概述
在这篇简短的文章中,我们将研究 Apache Commons Collections 库中的一个有趣的数据结构 - BidiMap。
BidiMap增加了使用标准Map接口顶部的相应值查找键的可能性。
2. 依赖
我们需要在我们的项目中包含以下依赖项,以便我们使用BidiMap及其实现。对于基于 Maven 的项目,我们必须在pom.xml中添加以下依赖项:
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-collections4</artifactId>
<version>4.1</version>
</dependency>
对于基于 Gradle 的项目,我们必须将相同的工件添加到我们的build.gradle文件中:
compile 'org.apache.commons:commons-collections4:4.1'
可以在 Maven Central 上找到此依赖项的最新版本。
3. 实现和实例化
BidiMap本身只是一个定义双向地图特有行为的接口——当然有多种实现可用。
重要的是要了解BidiMap 的实现不允许键和值重复。当BidiMap反转时,任何重复的值都将被转换为重复的键,并且会违反地图协定。地图必须始终具有唯一键。
让我们看一下这个接口的不同具体实现:
- DualHashBidiMap:此实现使用两个HashMap实例在内部实现 BidiMap。它使用条目的键或值提供对条目的快速查找。但是,必须维护HashMap的两个实例
- DualLinkedHashBidiMap:此实现使用两个LinkedHashMap实例,因此维护映射条目的插入顺序。如果我们不需要维护映射条目的插入顺序,我们可以使用更便宜的DualHashBidiMap
- *TreeBidiMap:*这个实现是高效的,由红黑树实现。TreeBidiMap的键和值保证使用键和值的自然顺序按升序排序
- 还有DualTreeBidiMap使用TreeMap的两个实例来实现与TreeBidiMap相同的事情。DualTreeBidiMap明显比TreeBidiMap贵
BidiMap接口扩展了java.util.Map接口,因此可以作为它的替代品。我们可以使用具体实现的无参数构造函数来实例化一个具体的对象实例。
4. 独特的BidiMap方法
现在我们已经探索了不同的实现,让我们看看接口特有的方法。
*put()*将一个新的键值条目插入到 map中。请注意,如果新条目的值与任何现有条目的值匹配,则现有条目将被删除以支持新条目。
该方法返回已删除的旧条目,如果没有,则返回null :
BidiMap<String, String> map = new DualHashBidiMap<>();
map.put("key1", "value1");
map.put("key2", "value2");
assertEquals(map.size(), 2);
inverseBidiMap()反转BidiMap的键值对。**此方法返回一个新的BidiMap,其中键已成为值,反之亦然。此操作在翻译和字典应用程序中非常有用:
BidiMap<String, String> rMap = map.inverseBidiMap();
assertTrue(rMap.containsKey("value1") && rMap.containsKey("value2"));
removeValue()用于通过指定值而不是键来删除映射条目。这是对java.util包中Map实现的补充:
map.removeValue("value2");
assertFalse(map.containsKey("key2"));
**我们可以使用getKey()将键映射到BidiMap中的特定值。**如果没有键映射到指定值,则该方法返回null:
assertEquals(map.getKey("value1"), "key1");