Apache Commons Collections BidiMap

Apache Commons Collections BidiMap

1. 概要

この短い記事では、Apache Commons Collectionsライブラリの興味深いデータ構造であるBidiMapを見ていきます。

BidiMapは、標準のMapインターフェースの上に対応する値を使用してキーを検索する可能性を追加します。

2. 依存関係

BidiMapとその実装を使用するには、プロジェクトに次の依存関係を含める必要があります。 Mavenベースのプロジェクトの場合、pom.xmlに次の依存関係を追加する必要があります。


    org.apache.commons
    commons-collections4
    4.1

Gradleベースのプロジェクトの場合、同じアーティファクトをbuild.gradleファイルに追加する必要があります。

compile 'org.apache.commons:commons-collections4:4.1'

この依存関係の最新バージョンはon Maven Centralにあります。

3. 実装とインスタンス化

BidiMap自体は、双方向マップに固有の動作を定義する単なるインターフェイスであり、もちろん複数の実装が利用可能です。

実装はof BidiMap do not allow key and value duplicatesであることを理解することが重要です。 BidiMapが反転すると、重複する値は重複するキーに変換され、マップコントラクトに違反します。 マップには常に一意のキーが必要です。

このインターフェースのさまざまな具体的な実装を見てみましょう。

  • DualHashBidiMap:この実装は2つのHashMapインスタンスを使用してBidiMapを内部的に実装します.エントリのキーまたは値のいずれかを使用してエントリの高速ルックアップを提供します。 ただし、HashMapの2つのインスタンスを維持する必要があります

  • DualLinkedHashBidiMap:この実装は2つのLinkedHashMapインスタンスを使用するため、マップエントリの挿入順序を維持します。 マップエントリの挿入順序を維持する必要がない場合は、より安価なDualHashBidiMapを使用できます。

  • TreeBidiMap:この実装は効率的であり、赤黒木実装によって実現されます。 TreeBidiMapのキーと値は、キーと値の自然な順序を使用して昇順でソートされることが保証されています。

  • TreeMapの2つのインスタンスを使用してTreeBidiMapと同じことを実現するDualTreeBidiMapもあります。 DualTreeBidiMapは明らかにTreeBidiMapよりも高価です

BidiMapインターフェースはjava.util.Mapインターフェースを拡張するため、そのドロップイン代替として機能できます。 具体的な実装の引数なしのコンストラクターを使用して、具体的なオブジェクトインスタンスをインスタンス化できます.

4. 一意のBidiMapメソッド

さまざまな実装について説明したので、インターフェースに固有のメソッドを見てみましょう。

Theput()inserts a new key-value entry into the map。 新しいエントリの値が既存のエントリの値と一致する場合、既存のエントリは削除されて新しいエントリが優先されることに注意してください。

このメソッドは、削除された古いエントリを返します。存在しない場合はnullを返します。

BidiMap map = new DualHashBidiMap<>();
map.put("key1", "value1");
map.put("key2", "value2");
assertEquals(map.size(), 2);

The inverseBidiMap() reverses the key-value pair of aBidiMap.このメソッドは、キーが値になっている新しいBidiMapを返し、その逆も同様です。 この操作は、翻訳および辞書アプリケーションで非常に役立ちます。

BidiMap rMap = map.inverseBidiMap();
assertTrue(rMap.containsKey("value1") && rMap.containsKey("value2"));

The removeValue() is used to remove a map entry by specifying a value, instead of a key。 これは、java.utilパッケージにあるMap実装への追加です。

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

We can get the key mapped to a particular value in BidiMap with the getKey().指定された値にキーがマップされていない場合、メソッドはnullを返します。

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

5. 結論

このクイックチュートリアルでは、Apache Commons Collectionsライブラリ、特にBidiMap、その実装、および特異なメソッドについて説明しました。

BidiMapの最もエキサイティングで際立った機能は、キーと値を介してエントリを検索および操作する機能です。

いつものように、コードスニペットはover on GitHubで利用できます。