Apache Commons Collections OrderedMap

Apache Commons Collections OrderedMap

1. Überblick

DasApache Commons Collections library bietet nützliche Klassen, die das Java Collections Framework ergänzen.

In diesem Artikel werden wir die SchnittstelleOrderedMap überprüfen, diejava.util.Map erweitert.

2. Maven-Abhängigkeit

Das erste, was wir tun müssen, ist, die Maven-Abhängigkeit in unserepom.xml einzufügen:


    org.apache.commons
    commons-collections4
    4.1

Die neueste Version der Bibliothek finden Sie unterMaven Central repository.

3. OrderedMap Eigenschaften

Einfach ausgedrückt, eine Karte, die die Schnittstelle vonOrderedMapimplementiert:

  • Behält die Reihenfolge in seinem Schlüsselsatz bei, obwohl der Satz nicht sortiert ist

  • Kann mit den folgenden Methoden in beide Richtungen wiederholt werden:firstKey() undnextKey() oderlastKey() undpreviousKey()

  • Kann mitMapIterator durchlaufen werden (auch von der Bibliothek bereitgestellt)

  • Bietet Methoden zum Suchen, Ändern, Entfernen oder Ersetzen von Elementen

4. Verwenden vonOrderedMap

Lassen Sie uns in einer Testklasse einen Prozentsatz (t0) der Läufer und ihr Alter festlegen. Wir werdenLinkedMap verwenden - eine der in der Bibliothek bereitgestelltenOrderedMap-Implementierungen.

Richten wir zunächst Arrays von Läufern und Altersgruppen ein, mit denen wir die Karte laden und die Reihenfolge der Werte überprüfen:

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

    //...
}

Initialisieren wir nun unsere Karte:

@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. Vorwärtsiteration

Mal sehen, wie der Vorwärtsiterator verwendet wird:

@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++;
    }
}

Beachten Sie, dass die MethodenextKey() nach Erreichen des letzten Schlüssels einen Wert vonnullzurückgibt.

4.2. Rückwärtsiteration

Lassen Sie uns nun mit dem letzten Schlüssel beginnen:

@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--;
    }
}

Sobald wir den ersten Schlüssel erreicht haben, gibt die MethodepreviousKey()null zurück.

4.3. MapIterator Beispiel

Lassen Sie uns nunuse the mapIterator() method to obtain a MapIterator zeigen, wie die in den Arraysnames undages definierte Reihenfolge der Läufer beibehalten wird:

@Test
public void givenALinkedMap_whenIteratedWithMapIterator_thenPreservesOrder() {
    OrderedMapIterator 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. Elemente entfernen

Lassen Sie uns abschließend überprüfen, wiean element can be removed by index or by object:

@Test
public void givenALinkedMap_whenElementRemoved_thenSizeDecrease() {
    LinkedMap lmap
      = (LinkedMap) 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. Bereitgestellte Implementierungen

Derzeit gibt es in Version 4.1 der Bibliothek zwei Implementierungen derOrderedMap-Schnittstelle -ListOrderedMap undLinkedMap.

ListOrderedMap verfolgt die Reihenfolge des Schlüsselsatzes mitjava.util.List. Es ist ein Dekorator vonOrderedMap und kann mit der statischen MethodeListOrderedMap.decorate(Map map) aus jedemMap erstellt werden.

LinkedMap basiert auf einemHashMap und verbessert es, indem es eine bidirektionale Iteration und die anderen Methoden derOrderedMap-Schnittstelle zulässt.

Both implementations also provide three methods that are outside the OrderedMap interface:

  • asList() - Erhält eine Liste vom TypList<K> (wobeiK der Typ der Schlüssel ist), wobei die Reihenfolge der Karte beibehalten wird

  • get(int index) - Ruft das Element an Positionindex ab, im Gegensatz zu Methodeget(Object o), die in der Schnittstelle bereitgestellt wird

  • indexOf(Object o) - Ruft den Index des Objektso in der geordneten Karte ab

Wir können dieOrderedMap inLinkedMap umwandeln, um die MethodeasList() zu verwenden:

@Test
public void givenALinkedMap_whenConvertedToList_thenMatchesKeySet() {
    LinkedMap lmap
      = (LinkedMap) this.runnersLinkedMap;

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

    assertEquals(listKeys, linkedMap);
}

Dann können wir die Funktionsweise der MethodenindexOf(Object o) undget(int index) in der Implementierung vonLinkedMap überprüfen:

@Test
public void givenALinkedMap_whenSearchByIndexIsUsed_thenMatchesConstantArray() {
    LinkedMap lmap
      = (LinkedMap) 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. Fazit

In diesem kurzen Tutorial haben wir dieOrderedMap-Schnittstelle und ihre primären Methoden und Implementierungen überprüft.

Weitere Informationen finden Sie unterthe JavaDoc of the Apache Commons Collections library.

Wie immer enthält die vollständige Testklasse für diesen Artikel ähnliche Testfälle mitLinkedMap undListOrderedMap und kann vonGitHub project heruntergeladen werden.