Вступление
В этом уроке будут рассмотрены некоторые общие методы удаления элементов из массивов Java. Манипулирование элементами массива является чрезвычайно распространенной задачей, поскольку дискуссии об этом можно найти на многих форумах, особенно на StackOverflow.
Вот список приемов и методов, которые мы рассмотрим в этой статье:
- Использование Двух Массивов
- Arrayutils.удалить()
- Использование цикла for
- System.arraycopy()
Краткий брифинг по массивам
Массивы-это структуры данных, распространенные во многих языках программирования. Каждый массив хранится в одном блоке памяти и обеспечивает последовательное хранение и простое управление элементами:
Кредит: CodeForWin
Элементы последовательно сохраняются один за другим. Когда кто-то хочет получить доступ к элементу с определенным индексом, арифметика указателей (которая является механизмом под капотом) позволяет быстро и эффективно получить любой конкретный элемент.
Если индекс запрашиваемого элемента равен 3
, базовому механизму просто нужно взять адрес памяти нулевого -го элемента и добавить размер каждого элемента в три раза больше. Поскольку все элементы массива имеют одинаковый размер, этот вид вычисления приводит непосредственно к элементу с индексом 3
. Кроме того, это происходит в O(1)
сложности, что означает, что это происходит так быстро, как только может быть.
Что затрудняет удаление элемента массива, так это тот факт, что все элементы последовательно хранятся в одном блоке памяти. Из-за характера размещения памяти массива просто невозможно удалить элемент напрямую.
Вместо этого, чтобы “удалить” какой-либо элемент, все последующие элементы должны быть сдвинуты назад на одно место. Это создаст иллюзию того, что определенный элемент был удален.
Использование Двух Массивов
Самый простой чистый Java – способ сделать это-создать новый массив, на один элемент короче исходного, и скопировать в него все элементы, кроме того, который мы хотели бы удалить:
int[] copy = new int[array.length - 1]; for (int i = 0, j = 0; i < array.length; i++) { if (i != index) { copy[j++] = array[i]; } }
Здесь мы просто повторяем исходный массив и копируем элементы из исходного массива в новый массив, пропуская тот, который мы хотели бы удалить.
Массив copy
теперь состоит из:
10, 20, 30, 50, 60, 70, 80, 90, 100
ArrayUtils.удалить()
В случае, если вы уже используете библиотеку Apache Commons, вы можете использовать метод ArrayUtils.remove ()
.
Прежде чем работать с Apache Commons, мы захотим добавить его в наш проект:
org.apache.commons commons-lang3 ${version}
Использовать этот метод действительно просто. Мы просто предоставляем ему массив, из которого мы хотели бы удалить элемент, и его индекс:
int[] array = {10, 20, 30, 40, 50, 60, 70, 80, 90, 100}; int index = 3; array = ArrayUtils.remove(array, index);
Затем он возвращает новый массив, который хранится в переменной array
:
10, 20, 30, 50, 60, 70, 80, 90, 100
Использование цикла for
Казалось бы, самый простой способ удалить элемент-это выполнить итерацию массива вручную с помощью цикла для
. В качестве альтернативы также можно использовать цикл while
, но для
гораздо более подходит для этого типа задач.
Скажем, мы хотим удалить третий элемент:
int[] array = {10, 20, 30, 40, 50, 60, 70, 80, 90, 100}; int index = 3;
Элемент, соответствующий индексу 3
является 40
. Чтобы удалить этот элемент, мы просто “сдвигаем” все элементы после него. Это означает, что мы собираемся повторить все элементы после 40
и просто “переместите” их на одно место влево.
Git Essentials
Ознакомьтесь с этим практическим руководством по изучению Git, содержащим лучшие практики и принятые в отрасли стандарты. Прекратите гуглить команды Git и на самом деле изучите это!
Поскольку просто переместить элемент невозможно, вместо этого мы копируем его значение. Последующие копии перезапишут исходные значения, и результат будет таким, как если бы вся правая часть массива была сдвинута влево на единицу:
for (int i = index; i < array.length - 1; i++) { array[i] = array[i + 1]; }
Если бы мы пошли и напечатали измененный массив, это был бы результат:
10, 20, 30, 50, 60, 70, 80, 90, 100, 100
Массивы имеют фиксированную длину. Последний элемент, 100
, дублируется из-за этого. Используя один массив, невозможно удалить элемент, не заполнив новый пробел каким-либо значением.
Вы могли бы переопределить его фиктивным значением, таким как -1
, но это решение не очень корректно. Это устраняется С помощью двух массивов .
Вы || могли бы || переопределить его фиктивным значением, таким как|| -1 || , но это решение не очень корректно. Это устраняется || С помощью двух массивов || .
Сокращенный способ сделать то же самое, что и раньше, но в одной строке кода, – это метод System.arraycopy()
:
public static void arraycopy(Object src, int srcPos, Object dest, int destPos, int length);
Метод принимает исходный массив и позицию , с которой следует начать копирование. Он также принимает целевой массив и позицию , в которую нужно начать копирование. Последним аргументом является количество элементов, которые необходимо скопировать из исходного массива.
arraycopy
обычно используется для копирования содержимого из некоторого исходного массива в некоторый целевой массив. Хотя мы также можем скопировать массив или его часть в себя. Это позволяет нам сдвинуть часть его влево, как в прошлый раз:
int[] array = {10, 20, 30, 40, 50, 60, 70, 80, 90, 100}; int index = 3;
Чтобы удалить элемент, нам нужно написать только одну строку кода:
System.arraycopy(array, index + 1, array, index, array.length - index - 1);
Метод скопирует все элементы из исходного массива ( массив
), начиная с одной позиции справа от индекса
. Элементы будут скопированы в один и тот же массив ( массив
), начиная точно с индекса
. Результатом будет воспринимаемое смещение всех элементов справа от элемента, который мы хотели удалить.
Если бы мы напечатали результат, мы все равно увидели бы элемент 100
дублируется по той же причине, что и в предыдущем разделе. В следующем разделе мы покажем, как полностью устранить эту проблему.
Вывод
В этом уроке мы показали несколько способов удаления элементов массива. Некоторые из них быстры и грязны, в то время как некоторые требуют дополнительных затрат, таких как использование дополнительных библиотек. Всегда лучше подумать об этих вещах заранее, чтобы получить представление о том, какой подход подходит для любой конкретной ситуации.
Список техник, показанных в этом руководстве, ни в коем случае не является исчерпывающим. Существует множество способов проявить творческий подход в программировании, поэтому мы уверены, что вы сможете найти другие интересные подходы к удалению элементов из массивов.