1. Обзор
В этой короткой статье мы рассмотрим интересную структуру данных в библиотеке коллекций Apache Commons – 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'
Последнюю версию этой зависимости можно найти на Maven Central .
3. Реализация и создание экземпляров
BidiMap сам по себе является всего лишь интерфейсом, который определяет поведение, уникальное для двунаправленной карты, и, конечно, существует несколько доступных реализаций.
Важно понимать, что реализации | BidiMap не допускают дублирования ключей и значений . Когда BidiMap инвертируется, любые повторяющиеся значения будут преобразованы в дубликаты ключей и нарушат контракт карты. Карта всегда должна иметь уникальные ключи.
Давайте рассмотрим различные конкретные реализации этого интерфейса:
- DualHashBidiMap : Эта реализация использует два экземпляра HashMap для внутренней реализации BidiMap . Он обеспечивает быстрый поиск записей с использованием ключа или значения записи. Однако необходимо сохранить два экземпляра HashMap
- DualLinkedHashBidiMap: Эта реализация использует два экземпляра LinkedHashMap и, следовательно, поддерживает порядок вставки записей карты. Если нам не нужно поддерживать порядок вставки записей карты, мы можем просто использовать менее дорогой DualHashBidiMap
- TreeBidiMap: Эта реализация эффективна и реализуется с помощью реализации Красно-черного дерева. Ключи и значения TreeBidiMap гарантированно сортируются в порядке возрастания с использованием естественного порядка ключей и значений
- Существует также DualTreeBidiMap , который использует два экземпляра TreeMap для достижения того же, что и TreeBidiMap . DualTreeBidiMap , очевидно, дороже, чем TreeBidiMap
Интерфейс BidiMap расширяет java.util.Интерфейс Map и поэтому может служить его заменой. Мы можем использовать конструктор no-arg конкретных реализаций для создания экземпляра конкретного экземпляра объекта .
4. Уникальные методы BidiMap
Теперь, когда мы изучили различные реализации, давайте рассмотрим методы, уникальные для интерфейса.
put () |/вставляет новую запись ключа-значения в карту . Обратите внимание, что если значение новой записи совпадает со значением любой существующей записи, существующая запись будет удалена в пользу новой записи.
Метод возвращает удаленную старую запись или null , если ее нет:
BidiMapmap = new DualHashBidiMap<>(); map.put("key1", "value1"); map.put("key2", "value2"); assertEquals(map.size(), 2);
inverseBidiMap() переворачивает пару ключ-значение BidiMap. Этот метод возвращает новый BidiMap , где ключи стали значениями и наоборот. Эта операция может быть очень полезна в приложениях для перевода и словарей:
BidiMaprMap = map.inverseBidiMap(); assertTrue(rMap.containsKey("value1") && rMap.containsKey("value2"));
remove Value() используется для удаления записи карты путем указания значения вместо ключа . Это дополнение к реализациям 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 .