Коллекции Apache Commons BidiMap

Коллекции Apache Commons 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: эта реализация использует два экземпляраHashMap для внутренней реализации BidiMap.. Он обеспечивает быстрый поиск записей с использованием ключа или значения записи. Однако необходимо поддерживать два экземпляраHashMap.

  • DualLinkedHashBidiMap: Эта реализация использует два экземпляраLinkedHashMap и, следовательно, поддерживает порядок вставки записей карты. Если нам не нужно поддерживать порядок вставки записей карты, мы можем просто использовать менее затратныйDualHashBidiMap

  • TreeBidiMap: Эта реализация эффективна и реализована в виде красно-черного дерева. Ключи и значенияTreeBidiMap гарантированно будут отсортированы в возрастающем порядке с использованием естественного порядка ключей и значений.

  • Также существуетDualTreeBidiMap, который использует два экземпляраTreeMap для достижения того же результата, что иTreeBidiMap. 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. Это дополнение к реализациямMap в пакетеjava.util:

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, в частностиBidiMap, ее реализации и идиосинкразические методы.

Самая захватывающая и отличительная особенностьBidiMap - это его способность искать и управлять записями с помощью ключей, а также значений.

Как всегда доступны фрагменты кодаover on GitHub.