Перейти к основному содержимому

Обработка массивов с помощью Apache Commons Lang 3

· 6 мин. чтения

Задача: Наибольшая подстрока без повторений

Для заданной строки s, найдите длину наибольшей подстроки без повторяющихся символов. Подстрока — это непрерывная непустая последовательность символов внутри строки...

ANDROMEDA 42

1. Обзор

Библиотека Apache Commons Lang 3 обеспечивает поддержку манипулирования основными классами API Java. Эта поддержка включает методы для обработки строк, чисел, дат, параллелизма, отражения объектов и многого другого.

В этом кратком руководстве мы сосредоточимся на обработке массивов с помощью очень полезного служебного класса ArrayUtils .

2. Зависимость от Maven

Чтобы использовать библиотеку Commons Lang 3, просто извлеките ее из центрального репозитория Maven, используя следующую зависимость:

<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.12.0</version>
</dependency>

Вы можете найти последнюю версию этой библиотеки здесь .

3. ArrayUtils

Класс ArrayUtils предоставляет служебные методы для работы с массивами. Эти методы пытаются изящно обработать ввод, предотвращая создание исключения при передаче нулевого значения.

В этом разделе показаны некоторые методы, определенные в классе ArrayUtils . Обратите внимание, что все эти методы могут работать с любым типом элемента.

Для удобства их перегруженные разновидности также определены для обработки массивов, содержащих примитивные типы.

4. добавить и добавить все

Метод add копирует заданный массив и вставляет заданный элемент в заданную позицию в новом массиве. Если позиция не указана, новый элемент добавляется в конец массива.

Следующий фрагмент кода вставляет ноль в первую позицию массива oldArray и проверяет результат:

int[] oldArray = { 2, 3, 4, 5 };
int[] newArray = ArrayUtils.add(oldArray, 0, 1);
int[] expectedArray = { 1, 2, 3, 4, 5 };

assertArrayEquals(expectedArray, newArray);

Если позиция не указана, в конец oldArray добавляется дополнительный элемент :

int[] oldArray = { 2, 3, 4, 5 };
int[] newArray = ArrayUtils.add(oldArray, 1);
int[] expectedArray = { 2, 3, 4, 5, 1 };

assertArrayEquals(expectedArray, newArray);

Метод addAll добавляет все элементы в конец заданного массива. Следующий фрагмент иллюстрирует этот метод и подтверждает результат:

int[] oldArray = { 0, 1, 2 };
int[] newArray = ArrayUtils.addAll(oldArray, 3, 4, 5);
int[] expectedArray = { 0, 1, 2, 3, 4, 5 };

assertArrayEquals(expectedArray, newArray);

5. удалить и удалить все

Метод remove удаляет элемент в указанной позиции из заданного массива. Все последующие элементы сдвигаются влево. Обратите внимание, что это верно для всех операций удаления.

Этот метод возвращает новый массив вместо внесения изменений в исходный:

int[] oldArray = { 1, 2, 3, 4, 5 };
int[] newArray = ArrayUtils.remove(oldArray, 1);
int[] expectedArray = { 1, 3, 4, 5 };

assertArrayEquals(expectedArray, newArray);

Метод removeAll удаляет все элементы в указанных позициях из заданного массива:

int[] oldArray = { 1, 2, 3, 4, 5 };
int[] newArray = ArrayUtils.removeAll(oldArray, 1, 3);
int[] expectedArray = { 1, 3, 5 };

assertArrayEquals(expectedArray, newArray);

6. удалитьЭлемент и удалитьЭлементы

Метод removeElement удаляет первое вхождение указанного элемента из заданного массива.

Вместо того, чтобы генерировать исключение, операция удаления игнорируется, если такой элемент не существует в данном массиве:

int[] oldArray = { 1, 2, 3, 3, 4 };
int[] newArray = ArrayUtils.removeElement(oldArray, 3);
int[] expectedArray = { 1, 2, 3, 4 };

assertArrayEquals(expectedArray, newArray);

Метод removeElements удаляет первые вхождения указанных элементов из заданного массива.

Вместо создания исключения операция удаления игнорируется, если указанный элемент не существует в данном массиве:

int[] oldArray = { 1, 2, 3, 3, 4 };
int[] newArray = ArrayUtils.removeElements(oldArray, 2, 3, 5);
int[] expectedArray = { 1, 3, 4 };

assertArrayEquals(expectedArray, newArray);

7. API removeAllOccurences

Метод removeAllOccurences удаляет все вхождения указанного элемента из заданного массива.

Вместо того, чтобы генерировать исключение, операция удаления игнорируется, если такой элемент не существует в данном массиве:

int[] oldArray = { 1, 2, 2, 2, 3 };
int[] newArray = ArrayUtils.removeAllOccurences(oldArray, 2);
int[] expectedArray = { 1, 3 };

assertArrayEquals(expectedArray, newArray);

8. Содержит API

Метод contains проверяет, существует ли значение в данном массиве. Вот пример кода, включая проверку результата:

int[] array = { 1, 3, 5, 7, 9 };
boolean evenContained = ArrayUtils.contains(array, 2);
boolean oddContained = ArrayUtils.contains(array, 7);

assertEquals(false, evenContained);
assertEquals(true, oddContained);

9. Обратный API

Метод reverse изменяет порядок элементов в указанном диапазоне заданного массива. Этот метод вносит изменения в переданный массив вместо того, чтобы возвращать новый.

Давайте посмотрим на быстро:

int[] originalArray = { 1, 2, 3, 4, 5 };
ArrayUtils.reverse(originalArray, 1, 4);
int[] expectedArray = { 1, 4, 3, 2, 5 };

assertArrayEquals(expectedArray, originalArray);

Если диапазон не указан, порядок всех элементов меняется на обратный:

int[] originalArray = { 1, 2, 3, 4, 5 };
ArrayUtils.reverse(originalArray);
int[] expectedArray = { 5, 4, 3, 2, 1 };

assertArrayEquals(expectedArray, originalArray);

10. Сменный API

Метод сдвига сдвигает ряд элементов в заданном массиве на несколько позиций. Этот метод вносит изменения в переданный массив вместо того, чтобы возвращать новый.

Следующий фрагмент кода сдвигает все элементы между элементами с индексом 1 (включительно) и индексом 4 (исключительно) на одну позицию вправо и подтверждает результат:

int[] originalArray = { 1, 2, 3, 4, 5 };
ArrayUtils.shift(originalArray, 1, 4, 1);
int[] expectedArray = { 1, 4, 2, 3, 5 };

assertArrayEquals(expectedArray, originalArray);

Если границы диапазона не указаны, сдвигаются все элементы массива:

int[] originalArray = { 1, 2, 3, 4, 5 };
ArrayUtils.shift(originalArray, 1);
int[] expectedArray = { 5, 1, 2, 3, 4 };

assertArrayEquals(expectedArray, originalArray);

11. API подмассива

Метод подмассива создает новый массив, содержащий элементы в указанном диапазоне данного массива. Ниже приведен пример утверждения результата:

int[] oldArray = { 1, 2, 3, 4, 5 };
int[] newArray = ArrayUtils.subarray(oldArray, 2, 7);
int[] expectedArray = { 3, 4, 5 };

assertArrayEquals(expectedArray, newArray);

Обратите внимание, что когда переданный индекс больше длины массива, он понижается до длины массива, а не вызывает исключение метода. Точно так же, если передается отрицательный индекс, он повышается до нуля.

12. API подкачки

Метод swap меняет местами ряд элементов в указанных позициях в заданном массиве.

Следующий фрагмент кода меняет местами две группы элементов, начиная с индексов 0 и 3, причем каждая группа содержит два элемента:

int[] originalArray = { 1, 2, 3, 4, 5 };
ArrayUtils.swap(originalArray, 0, 3, 2);
int[] expectedArray = { 4, 5, 3, 1, 2 };

assertArrayEquals(expectedArray, originalArray);

Если аргумент длины не передается, заменяется только один элемент в каждой позиции:

int[] originalArray = { 1, 2, 3, 4, 5 };
ArrayUtils.swap(originalArray, 0, 3);
int[] expectedArray = { 4, 2, 3, 1, 5 };
assertArrayEquals(expectedArray, originalArray);

13. Заключение

В этом руководстве представлена основная утилита обработки массивов в Apache Commons Lang 3 — ArrayUtils .

Как всегда, реализацию всех приведенных выше примеров и фрагментов кода можно найти в проекте GitHub .