Apache Commons CollectionsのOrderedMap

1概要

Apache Commons Collections library は、Java Collections Frameworkを補完する便利なクラスを提供します。

この記事では、 java.util.Map を拡張するインターフェースhttps://commons.apache.org/proper/commons-collections/apidocs/org/apache/commons/collections4/OrderedMap.html[ OrderedMap ]を確認します。

2 Mavenの依存関係

最初にやらなければならないことは、 pom.xml にMavenの依存関係を追加することです。

<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-collections4</artifactId>
    <version>4.1</version>
</dependency>

ライブラリの最新版はhttps://search.maven.org/classic/#search%7Cgav%7C1%7Cg%3A%22org.apache.commons%22%20AND%20a%3A%22commons-にありますcollections4%22[Maven Centralリポジトリ]。

3 OrderedMap プロパティ

簡単に言うと、 OrderedMap インターフェースを実装するマップです。

  • セットはソートされていませんが、キーのセットの順序を維持します

  • firstKey() およびメソッドを使用して両方向に反復できます。

nextKey() 、または lastKey() previousKey() ** MapIterator (これもライブラリによって提供されます)を使って移動できます。

  • 要素を検索、変更、削除、または置換するためのメソッドを提供します。

4 OrderedMap を使用する

テストクラスでランナーとその年齢の OrderedMap を設定しましょう。

ライブラリで提供されている OrderedMap 実装の1つである LinkedMap を使用します。

まず、地図を読み込み、値の順序を確認するために使用するランナーと年齢の配列を設定しましょう。

public class OrderMapUnitTest {
    private String[]names = {"Emily", "Mathew", "Rose", "John", "Anna"};
    private Integer[]ages = {37, 28, 40, 36, 21};
    private LinkedMap<String, Integer> runnersLinkedMap;

   //...
}

それでは、地図を初期化しましょう。

@Before
public void createRunners() {
    this.runnersLinkedMap = new LinkedMap<>();

    for (int i = 0; i < RUNNERS__COUNT; i++) {
        runners.put(this.names[i], this.ages[i]);
    }
}

4.1. 前方反復

順方向反復子の使用方法を見てみましょう。

@Test
public void givenALinkedMap__whenIteratedForwards__thenPreservesOrder() {
    String name = this.runnersLinkedMap.firstKey();
    int i = 0;
    while (name != null) {
        assertEquals(name, names[i]);
        name = this.runnersLinkedMap.nextKey(name);
        i++;
    }
}
  • 最後のキーに到達すると、 nextKey()メソッドは null__値を返します。

4.2. 後方反復

最後のキーから始めて、繰り返します。

@Test
public void givenALinkedMap__whenIteratedBackwards__thenPreservesOrder() {
    String name = this.runnersLinkedMap.lastKey();
    int i = RUNNERS__COUNT - 1;
    while (name != null) {
        assertEquals(name, this.names[i]);
        name = this.runnersLinkedMap.previousKey(name);
        i--;
    }
}
  • 最初のキーに到達すると、 previousKey() メソッドはnullを返します。

4.3. MapIterator の例

それでは mapIterator() メソッドを使って MapIterator ** を取得しましょう。配列 names ages で定義されているランナーの順番をどのように保持するかを示します。

@Test
public void givenALinkedMap__whenIteratedWithMapIterator__thenPreservesOrder() {
    OrderedMapIterator<String, Integer> runnersIterator
      = this.runnersLinkedMap.mapIterator();

    int i = 0;
    while (runnersIterator.hasNext()) {
        runnersIterator.next();

        assertEquals(runnersIterator.getKey(), this.names[i]);
        assertEquals(runnersIterator.getValue(), this.ages[i]);
        i++;
    }
}

4.4. 要素を削除する

最後に、要素をインデックスまたはオブジェクトによってどのように削除できるかを確認しましょう。

@Test
public void givenALinkedMap__whenElementRemoved__thenSizeDecrease() {
    LinkedMap<String, Integer> lmap
      = (LinkedMap<String, Integer>) this.runnersLinkedMap;

    Integer johnAge = lmap.remove("John");

    assertEquals(johnAge, new Integer(36));
    assertEquals(lmap.size(), RUNNERS__COUNT - 1);

    Integer emilyAge = lmap.remove(0);

    assertEquals(emilyAge, new Integer(37));
    assertEquals(lmap.size(), RUNNERS__COUNT - 2);
}

5提供されている実装

現在、このライブラリのバージョン4.1では、 OrderedMap インタフェースの実装が2つあります - ListOrderedMap LinkedMap

ListOrderedMap は、 java.util.List を使用してキーセットの順序を追跡します。 。これは OrderedMap のデコレータであり、静的メソッド ListOrderedMap.decorate(Map map) を使用して任意の Map から作成できます。

LinkedMap HashMap に基づいており、双方向の反復を許可することでそれを改善しています OrderedMap インターフェースのメソッド。

  • どちらの実装も OrderedMap インターフェースの外側にある3つのメソッドを提供します

  • asList() - List <K> 型のリストを取得する(ここで、 K は型です)

キーの)マップの順序を維持する get(int index) ** - 反対に位置 index の要素を取得する

インタフェースに提供されたメソッド get(Object o) indexOf(Object o) ** - 内のオブジェクト o のインデックスを取得します。

順序付きマップ

asList() メソッドを使用するために、 OrderedMap LinkedMap にキャストできます。

@Test
public void givenALinkedMap__whenConvertedToList__thenMatchesKeySet() {
    LinkedMap<String, Integer> lmap
      = (LinkedMap<String, Integer>) this.runnersLinkedMap;

    List<String> listKeys = new ArrayList<>();
    listKeys.addAll(this.runnersLinkedMap.keySet());
    List<String> linkedMap = lmap.asList();

    assertEquals(listKeys, linkedMap);
}

それから LinkedMap 実装でメソッド indexOf(Object o) get(int index) の機能を確認することができます。

@Test
public void givenALinkedMap__whenSearchByIndexIsUsed__thenMatchesConstantArray() {
    LinkedMap<String, Integer> lmap
      = (LinkedMap<String, Integer>) this.runnersLinkedMap;

    for (int i = 0; i < RUNNERS__COUNT; i++) {
        String name = lmap.get(i);

        assertEquals(name, this.names[i]);
        assertEquals(lmap.indexOf(this.names[i]), i);
    }
}

6. 結論

このクイックチュートリアルでは、 OrderedMap インターフェイスとその主なメソッドと実装について説明しました。

詳細はhttps://commons.apache.org/proper/commons-collections/apidocs/index.html[Apache Commons Collections libraryのJavaDoc]を参照してください。

いつものように、この記事の完全なテストクラスには、 LinkedMap ListOrderedMap の両方を使った同様のテストケースが含まれています。https://github.com/eugenp/tutorials/tree/master/libraries-apache-commons[GitHubプロジェクト]からダウンロードできます。 。

"

  • «** 前へ