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

Коллекции Apache Commons заказалиMap

Быстрое и практическое руководство по интерфейсу OrderedMap и реализациям из библиотеки коллекций Apache Commons.

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

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 LinkedMap runnersLinkedMap;
 
    //...
}

Теперь давайте о инициализируем нашу карту:

@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() {
    OrderedMapIterator runnersIterator 
      = 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() {
    LinkedMap lmap 
      = (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() {
    LinkedMap lmap 
      = (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() {
    LinkedMap lmap 
      = (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 .