Перейти к основному содержимому

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

· 3 мин. чтения

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 .