Рубрики
Без рубрики

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

Узнайте о BidiMap из библиотеки Apache Commons Collections.

Автор оригинала: baeldung.

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 , если ее нет:

BidiMap map = new DualHashBidiMap<>();
map.put("key1", "value1");
map.put("key2", "value2");
assertEquals(map.size(), 2);

inverseBidiMap() переворачивает пару ключ-значение BidiMap. Этот метод возвращает новый BidiMap , где ключи стали значениями и наоборот. Эта операция может быть очень полезна в приложениях для перевода и словарей:

BidiMap rMap = 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 .