«1. Обзор

В этой короткой статье мы рассмотрим интересную структуру данных в библиотеке Apache Commons Collections — BidiMap.

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

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

Интерфейс BidiMap расширяет интерфейс java.util.Map и поэтому может служить его заменой. Мы можем использовать конструктор без аргументов конкретных реализаций для создания экземпляра конкретного объекта.

4. Уникальные методы BidiMap

Теперь, когда мы изучили различные реализации, давайте рассмотрим методы, уникальные для интерфейса.

Функция put() вставляет в карту новую запись \»ключ-значение\». Обратите внимание, что если значение новой записи совпадает со значением любой существующей записи, существующая запись будет удалена в пользу новой записи.

Метод возвращает удаленную старую запись или 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() используется для удаления записи карты путем указания значения вместо ключа. Это дополнение к реализациям Map, найденным в пакете java.util:

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

Мы можем сопоставить ключ с определенным значением в BidiMap с помощью getKey(). Метод возвращает значение null, если ключ не сопоставлен с указанным значением:

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

5. Заключение

В этом кратком руководстве представлен обзор библиотеки Apache Commons Collections, в частности BidiMap, ее реализации и уникальных методов. .

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

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

Next »

A Guide to Apache Commons Collections CollectionUtils

« Previous

Apache Commons Collections OrderedMap