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:此實現是有效的,並且由Red-Black樹實現實現。保證TreeBidiMap的鍵和值使用鍵和值的自然順序升序排序
  • 還有DualTreeBidiMap ,它使用TreeMap的兩個實例來實現與TreeBidiMap相同的功能DualTreeBidiMap顯然比TreeBidiMap

BidiMap接口擴展了java.util.Map接口,因此可以替代它。我們可以使用具體實現的無參數構造函數來實例化具體對象實例

4.獨特的BidiMap方法

現在,我們已經探索了不同的實現,讓我們看一下該接口特有的方法。

()**插入一個新的鍵值進入地圖**。請注意,如果新條目的值與任何現有條目的值匹配,則將刪除現有條目以支持新條目。

該方法返回刪除的舊條目;如果不存在,則返回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()用於通過指定值而不是key來刪除映射條目。這是在java.util包中找到的Map實現的補充:

map.removeValue("value2");

 assertFalse(map.containsKey("key2"));

我們可以使用getKey()將鍵映射到BidiMap中的特定值如果沒有鍵映射到指定值,則該方法返回null

assertEquals(map.getKey("value1"), "key1");

5.結論

本快速教程提供了對Apache Commons Collections庫的了解-特別是在BidiMap ,其實現和特有方法上。

BidiMap最令人興奮和與眾不同的功能是它能夠通過鍵和值查找和操作條目。

與往常一樣,代碼片段可以在GitHub上找到