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 .