1. Обзор
Библиотека коллекций Apache Commons предоставляет полезные классы, дополняющие рамки Java Collections.
В этой статье мы рассмотрим интерфейс ЗаказалиМап , который распространяется java.util.Map .
2. Зависимость от Maven
Первое, что нам нужно сделать, это добавить зависимость Maven в нашей пом.xml :
org.apache.commons commons-collections4 4.1
Последнюю версию библиотеки можно найти на Maven Центральный репозиторий .
3. Свойства OrderedMap
Проще говоря, карта, которая реализует ЗаказалиМап интерфейс:
- Поддерживает порядок в наборе ключей, хотя набор не отсортирован
- Может быть итерирован в обоих направлениях с методами: firstKey () и nextKey () , или lastKey () и previousKey ()
- Можно пройти с помощью Маитератор (также предоставлено библиотекой)
- Предоставляет методы для обнаружения, изменения, удаления или замены элементов
4. Использование заказанной карты
Давайте навеем ЗаказалиМап бегунов и их возраст в тестовом классе. Мы будем использовать LinkedMap – один из ЗаказалиМап реализации, предоставляемые в библиотеке.
Во-первых, давайте навеем массивы бегунов и возрастов, которые мы будем использовать для загрузки карты и проверки порядка значений:
public class OrderMapUnitTest { private String[] names = {"Emily", "Mathew", "Rose", "John", "Anna"}; private Integer[] ages = {37, 28, 40, 36, 21}; private LinkedMaprunnersLinkedMap; //... }
Теперь давайте о инициализируем нашу карту:
@Before public void createRunners() { this.runnersLinkedMap = new LinkedMap<>(); for (int i = 0; i < RUNNERS_COUNT; i++) { runners.put(this.names[i], this.ages[i]); } }
4.1. Вперед итерации
Давайте посмотрим, как используется форвардный итератор:
@Test public void givenALinkedMap_whenIteratedForwards_thenPreservesOrder() { String name = this.runnersLinkedMap.firstKey(); int i = 0; while (name != null) { assertEquals(name, names[i]); name = this.runnersLinkedMap.nextKey(name); i++; } }
Обратите внимание, что когда мы достигли последнего ключа, метод nextKey () вернет недействительный ценность.
4.2. Обратная итерация
Теперь давайте итерировать назад, начиная с последнего ключа:
@Test public void givenALinkedMap_whenIteratedBackwards_thenPreservesOrder() { String name = this.runnersLinkedMap.lastKey(); int i = RUNNERS_COUNT - 1; while (name != null) { assertEquals(name, this.names[i]); name = this.runnersLinkedMap.previousKey(name); i--; } }
Как только мы достигнем первого ключа, previousKey () метод вернется нулевой.
4.3. Пример маитератора
Теперь давайте использовать mapIterator () метод получения Маитератор как мы покажем, как он сохраняет порядок бегунов, как определено в массивах имена и возрастных :
@Test public void givenALinkedMap_whenIteratedWithMapIterator_thenPreservesOrder() { OrderedMapIteratorrunnersIterator = this.runnersLinkedMap.mapIterator(); int i = 0; while (runnersIterator.hasNext()) { runnersIterator.next(); assertEquals(runnersIterator.getKey(), this.names[i]); assertEquals(runnersIterator.getValue(), this.ages[i]); i++; } }
4.4. Удаление элементов
Наконец, давайте проверим, насколько элемент может быть удален индексом или объектом :
@Test public void givenALinkedMap_whenElementRemoved_thenSizeDecrease() { LinkedMaplmap = (LinkedMap ) this.runnersLinkedMap; Integer johnAge = lmap.remove("John"); assertEquals(johnAge, new Integer(36)); assertEquals(lmap.size(), RUNNERS_COUNT - 1); Integer emilyAge = lmap.remove(0); assertEquals(emilyAge, new Integer(37)); assertEquals(lmap.size(), RUNNERS_COUNT - 2); }
5. При условии осуществления
В настоящее время в версии 4.1 библиотеки есть две реализации ЗаказалиМап интерфейс – ListOrderedMap и LinkedMap .
ListOrderedMap отслеживает порядок набора ключей с помощью java.util.List . Это декоратор ЗаказалиМап и может быть создан из любого Карта с помощью статического метода ListOrderedMap.decorate (Карта карта) .
LinkedMap основана на HashMap и улучшает его, позволяя двунаправленной итерации и другие методы ЗаказалиМап интерфейс.
Обе реализации также предоставляют три метода, которые находятся за пределами ЗаказалиМап интерфейс :
- asList () – получает список типов Список
(где K тип ключей), сохраняя порядок карты - получить (индекс int) – получает элемент в позиции индекс в отличие от методов получить (объект o) предусмотрено в интерфейсе
- indexOf(Object o) – получает индекс объекта o на заказанной карте
Мы можем бросить ЗаказалиМап в LinkedMap использовать asList () метод:
@Test public void givenALinkedMap_whenConvertedToList_thenMatchesKeySet() { LinkedMaplmap = (LinkedMap ) this.runnersLinkedMap; List listKeys = new ArrayList<>(); listKeys.addAll(this.runnersLinkedMap.keySet()); List linkedMap = lmap.asList(); assertEquals(listKeys, linkedMap); }
Затем мы можем проверить функционирование метода indexOf(Object o) и получить (индекс int) в LinkedMap реализация:
@Test public void givenALinkedMap_whenSearchByIndexIsUsed_thenMatchesConstantArray() { LinkedMaplmap = (LinkedMap ) this.runnersLinkedMap; for (int i = 0; i < RUNNERS_COUNT; i++) { String name = lmap.get(i); assertEquals(name, this.names[i]); assertEquals(lmap.indexOf(this.names[i]), i); } }
6. Заключение
В этом быстром учебнике мы рассмотрели ЗаказалиМап интерфейс и его основные методы и реализации.
Для получения дополнительной информации с м. JavaDoc библиотеки коллекций Apache Commons .
Как всегда, полный тестовый класс для этой статьи содержит аналогичные тестовые случаи с использованием как LinkedMap и ListOrderedMap и могут быть загружены из Проект GitHub .