Научитесь удалять элементы массива в Java по позициям индекса, а также по значениям элементов.
Обратите внимание, что теоретически мы можем удалить элемент массива двумя способами:
- Создайте новый массив и скопируйте все элементы из исходного массива, за исключением индекса или элемента, который нужно удалить, в новый массив. Это создает новый массив, поэтому он может не подойти для массивов большого размера, требующих значительного объема памяти. В этом методе исходный массив не затрагивается.
- Перезаписать все позиции индекса массива значением, сохраненным в его следующем индексе, начиная с индекса, который нужно удалить, до конца массива. Это фактически удаляет элемент по указанному индексу.
Поскольку мы не создаем новый массив, это более эффективно с точки зрения памяти. Обратите внимание, что мы можем захотеть заменить последнее значение индекса на null, чтобы не дублировать элементы в конце массива.
1. Удаление элементов массива с помощью ArrayUtils
Класс ArrayUtils входит в библиотеку Apache Commons Lang, которая предоставляет множество практических методов для работы с массивами в Java.
Для удаления элементов массива предусмотрены следующие методы. Все методы возвращают новый массив, а исходный массив не изменяется. После удаления элементов все последующие элементы массива сдвигаются влево.
- remove(array, index) – удаляет элемент по указанному индексу из указанного массива. Выдает исключение IndexOutOfBoundsException, если индекс выходит за пределы диапазона.
- removeAll(array, indexes…) – удаляет все элементы по указанным индексам из указанного массива.
- removeElement(array, item) – удаляет первое вхождение указанного элемента из указанного массива. Если массив не содержит такого элемента, то элементы из массива не удаляются.
- removeElements(array, items…) – удаляет вхождения указанных элементов в указанных количествах из указанного массива. Для любого элемента, который должен быть удален в больших количествах, чем содержалось в исходном массиве, не происходит никаких изменений, кроме удаления существующих соответствующих элементов.
- removeAllOccurrences(array, item) – удаляет все вхождения указанного элемента из указанного массива. Если массив не содержит такого элемента, то элементы из массива не удаляются.
Давайте рассмотрим несколько примеров использования этих API.
Программа Java для удаления элемента в позиции индекса 5.
Integer[] originalArray = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};Integer[] reducedArray = ArrayUtils.remove(originalArray, 5);//[0, 1, 2, 3, 4, 6, 7, 8, 9]
Программа Java для удаления элементов в позициях индекса 5, 6 и 7.
Integer[] originalArray = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};Integer[] reducedArray = ArrayUtils.removeAll(originalArray, 5, 6, 7);//[0, 1, 2, 3, 4, 8, 9]
Программа на Java для удаления значения 7 из массива.
Integer[] originalArray = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};Integer[] reducedArray = ArrayUtils.removeElement(originalArray, 7);//[0, 1, 2, 3, 4, 5, 6, 8, 9]
Программа на Java для удаления нескольких элементов из массива.
Integer[] originalArray = {1, 1, 2, 2, 3, 3, 3, 4, 4, 4};Integer[] reducedArray = ArrayUtils.removeElements(originalArray, 1, 2, 3);//[1, 2, 3, 3, 4, 4, 4]Integer[] reducedArray = ArrayUtils.removeElements(originalArray, 1, 1, 2, 2, 3);//[3, 3, 4, 4, 4]
Программа на Java для удаления всех вхождений элемента из массива.
Integer[] originalArray = {1, 1, 2, 2, 3, 3, 3, 4, 4, 4};Integer[] reducedArray = ArrayUtils.removeAllOccurrences(originalArray, 4);//[1, 1, 2, 2, 3, 3, 3]
2. Удаление элементов массива с помощью коллекций
Если память не является ограничением для небольших списков, мы можем рассмотреть возможность использования собственных API коллекций для написания собственной логики удаления элементов массива.
Самым простым способом будет преобразовать массив в список, поскольку списки поддерживают ряд простых в использовании методов для таких простых случаев, как:
- remove(index) – удаляет элемент из списка по указанному индексу.
- remove(item) – удаляет указанный элемент из массива.
- removeAll(item) – удалить все вхождения указанного элемента из массива.
- removeIf(predicate) – удаляет элементы, соответствующие указанному предикату.
Integer[] originalArray = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};List<Integer> tempList = new ArrayList<>(Arrays.asList(originalArray));tempList.remove(7);tempList.removeAll(5);Integer[] reducedArray = tempList.toArray(new Integer[0]);
3. Удаление и сдвиг элементов в цикле For
Предположим, что мы находимся в приложении, чувствительном к памяти, и мы не можем позволить себе создать новый массив. В этом случае мы можем зациклить элементы массива, удалить указанный элемент или индекс и сместить последующие элементы влево.
Последний элемент не будет перемещаться в этом процессе, а последний и предпоследний элементы будут дубликатами. Мы можем заменить последний элемент на null, чтобы исправить это поведение, если это необходимо.
Integer[] originalArray = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};removeIndexAndShift(originalArray, 6);//[0, 1, 2, 3, 4, 5, 7, 8, 9, null]removeIndexAndShift(originalArray, 2);//[0, 1, 3, 4, 5, 7, 8, 9, null, null]static <T> void removeIndexAndShift(T[] array, int indexToRemove) {for(int i = indexToRemove; i < array.length - 1; i++) {array[i] = array[i + 1];}//optionally we can set the last element to nullarray[array.length - 1] = null;}
4. Заключение
Этот короткий урок научил нас удалять элементы из массива, используя различные методы. Большинство методов создают новый массив, но мы можем вносить изменения в исходный массив, используя пользовательский код, если захотим.
Для более коротких массивов мы можем использовать встроенные API, такие как Collections или ArrayUtils. Нам нужно очень тщательно подумать о больших массивах, а затем использовать любое из предложенных выше решений.