Java массив удалить элементы

Удалить элемент из массива в Java

В этом уроке мы продемонстрируем примеры того, как удалить элемент из массива в Java с помощью двух массивов: ArrayUtils.remove (), цикла for и System.arraycopy().

Вступление

В этом уроке будут рассмотрены некоторые общие методы удаления элементов из массивов Java. Манипулирование элементами массива является чрезвычайно распространенной задачей, поскольку дискуссии об этом можно найти на многих форумах, особенно на StackOverflow.

Вот список приемов и методов, которые мы рассмотрим в этой статье:

  • Использование Двух Массивов
  • Arrayutils.удалить()
  • Использование цикла for
  • System.arraycopy()

Краткий брифинг по массивам

Массивы-это структуры данных, распространенные во многих языках программирования. Каждый массив хранится в одном блоке памяти и обеспечивает последовательное хранение и простое управление элементами:

Элементы последовательно сохраняются один за другим. Когда кто-то хочет получить доступ к элементу с определенным индексом, арифметика указателей (которая является механизмом под капотом) позволяет быстро и эффективно получить любой конкретный элемент.

Если индекс запрашиваемого элемента равен 3 , базовому механизму просто нужно взять адрес памяти нулевого -го элемента и добавить размер каждого элемента в три раза больше. Поскольку все элементы массива имеют одинаковый размер, этот вид вычисления приводит непосредственно к элементу с индексом 3 . Кроме того, это происходит в O(1) сложности, что означает, что это происходит так быстро, как только может быть.

Читайте также:  Python first class functions

Что затрудняет удаление элемента массива, так это тот факт, что все элементы последовательно хранятся в одном блоке памяти. Из-за характера размещения памяти массива просто невозможно удалить элемент напрямую.

Вместо этого, чтобы “удалить” какой-либо элемент, все последующие элементы должны быть сдвинуты назад на одно место. Это создаст иллюзию того, что определенный элемент был удален.

Использование Двух Массивов

Самый простой чистый 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 $ 

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

int[] array = ; int index = 3; array = ArrayUtils.remove(array, index);

Затем он возвращает новый массив, который хранится в переменной array :

10, 20, 30, 50, 60, 70, 80, 90, 100

Использование цикла for

Казалось бы, самый простой способ удалить элемент-это выполнить итерацию массива вручную с помощью цикла для . В качестве альтернативы также можно использовать цикл while , но для гораздо более подходит для этого типа задач.

Скажем, мы хотим удалить третий элемент:

Элемент, соответствующий индексу 3 является 40 . Чтобы удалить этот элемент, мы просто “сдвигаем” все элементы после него. Это означает, что мы собираемся повторить все элементы после 40 и просто “переместите” их на одно место влево.

Git Essentials

Ознакомьтесь с этим практическим руководством по изучению Git, содержащим лучшие практики и принятые в отрасли стандарты. Прекратите гуглить команды Git и на самом деле изучите это!

Поскольку просто переместить элемент невозможно, вместо этого мы копируем его значение. Последующие копии перезапишут исходные значения, и результат будет таким, как если бы вся правая часть массива была сдвинута влево на единицу:

Если бы мы пошли и напечатали измененный массив, это был бы результат:

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 обычно используется для копирования содержимого из некоторого исходного массива в некоторый целевой массив. Хотя мы также можем скопировать массив или его часть в себя. Это позволяет нам сдвинуть часть его влево, как в прошлый раз:

Чтобы удалить элемент, нам нужно написать только одну строку кода:

System.arraycopy(array, index + 1, array, index, array.length - index - 1);

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

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

Вывод

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

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

Читайте ещё по теме:

Источник

Как удалить элемент массива в Java?

В некоторых случаях возникает необходимость в удалении элементов из Java-массива. Однако язык программирования Java не предоставляет для выполнения этой операции прямого метода. Тем не менее ряд способов всё же имеется. О них и поговорим.

Начнём с того, что в обычном массиве удаление осуществляется не очень удобно. То есть мы не можем просто взять и удалить ячейку из Java-массива. Зато можем обнулить значение этой ячейки.

 
public class Cat < private String name; public Cat(String name) < this.name = name; >public static void main(String[] args) < Cat[] cats = new Cat[3]; cats[0] = new Cat("Том"); cats[1] = new Cat("Вася"); cats[2] = new Cat("Мурка"); cats[1] = null; System.out.println(Arrays.toString(cats)); >@Override public String toString() < return "Cat'; > >

Итак, мы видим, что кот Вася благополучно обнулился. Однако при выполнении такой операции в Java-массиве остаётся «дыра», поскольку мы удаляем лишь содержимое ячейки, но не саму ячейку. То есть мы получаем пустую ячейку в середине массива, что не есть хорошо.

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

 
public static void main(String[] args) < Cat[] cats = new Cat[4]; cats[0] = new Cat("Том"); cats[1] = new Cat("Вася"); cats[2] = new Cat("Мурка"); cats[3] = new Cat("Барсик"); cats[1] = null; for (int i = 2; i < cats.length-1; i++) < //выполняем перемещение элементов к началу, в результате чего пустая ячейка окажется в конце cats[i-1] = cats[i]; cats[i] = null; >System.out.println(Arrays.toString(cats)); >

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

Использование ArrayList

Если гора не идёт к Магомету, Магомет идёт к горе. Если мы не можем удалить элемент в обычном массиве, мы можем преобразовать массив в структуру, позволяющую удалять элементы. А потом преобразовать эту структуру обратно в массив.

Выполнить вышеописанную схему нам поможет java.util.List или ArrayList. Дело в том, что в ArrayList реализован специальный метод, позволяющий удалять элементы — remove. В общем виде всё выглядит так:

 
String[] array = new String[]; List list = new ArrayList<>(Arrays.asList(array)); list.remove("foo"); // Creates a new array with the same size as the list and copies the list // elements to it. array = list.toArray(new String[list.size()]); System.out.println(Arrays.toString(array)); //[bar, baz]

Давайте теперь рассмотрим работу метода remove на наших котах:

 
public static void main(String[] args) < ArrayListcats = new ArrayList<>(); Cat tom = new Cat("Том"); Cat vasya = new Cat("Вася"); Cat murka = new Cat("Мурка"); Cat barsik = new Cat("Барсик"); cats.add(tom); cats.add(vasya); cats.add(murka); cats.add(barsik); System.out.println(cats.toString()); cats.remove(1); System.out.println(cats.toString()); >

Итак, мы передали в метод индекс нашего объекта, в результате чего он был удален.

Тут следует отметить следующие особенности метода remove() : — он не оставляет так называемых «дыр» — в нём реализована логика сдвига элементов, если мы удаляем элемент из середины. Вот вывод предыдущего кода:

 
[Cat, Cat, Cat, Cat] [Cat, Cat, Cat]

То есть после удаления одного кота, остальные были передвинуты, и пробелов не осталось.

Кроме того, remove способен удалять объект не только по индексу, но и по ссылке:

 
public static void main(String[] args) < ArrayListcats = new ArrayList<>(); Cat tom = new Cat("Том"); Cat vasya = new Cat("Вася"); Cat murka = new Cat("Мурка"); Cat barsik = new Cat("Барсик"); cats.add(tom); cats.add(vasya); cats.add(murka); cats.add(barsik); System.out.println(cats.toString()); cats.remove(murka); System.out.println(cats.toString()); >
 
[Cat, Cat, Cat, Cat] [Cat, Cat, Cat]

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

Используем System.arraycopy

Мы можем просто создать копию исходного массива с помощью System.arraycopy(), удалив таким нехитрым способом соответствующий элемент:

 
int[] array = new int[] < 1, 2, 3, 4 >; // Original array. int[] result = new int[array.length - 1]; // Array which will contain the result. int index = 1; // Remove the value "2". // Copy the elements at the left of the index. System.arraycopy(array, 0, result, 0, index); // Copy the elements at the right of the index. System.arraycopy(array, index + 1, result, index, array.length - index - 1); System.out.println(Arrays.toString(result)); //[1, 3, 4]

Используем Apache Commons Lang

Последний способ, о котором стоит упомянуть, — применение библиотеки Apache Commons Lang и статического метода removeElement() класса ArrayUtils:

 
int[] array = new int[]; array = ArrayUtils.removeElement(array, 2); //remove first occurrence of 2 System.out.println(Arrays.toString(array)); //[1, 3, 4]

Apache Commons предоставляет нам библиотеку с именем org.apache.commons.lang3. Добавить библиотеку в ваш проект можно с помощью следующей maven-зависимости:

 
  org.apache.commons commons-lang3 3.0   

Данный пакет предоставляет класс ArrayUtils. Используя метод remove() этого класса, можно удалять элементы. Рассмотрим это на примере удаления повторяющихся элементов в массиве Java. Для обнаружения дублей надо сравнить каждый элемент Java-массива с оставшимися, для чего можно использовать 2 вложенных цикла.

 
import java.util.Arrays; import java.util.Scanner; import org.apache.commons.lang3.ArrayUtils; public class DeleteDuplicate < public static void main(String args[]) < Scanner sc = new Scanner(System.in); System.out.println("Enter the size of the array that is to be created::"); int size = sc.nextInt(); int[] myArray = new int[size]; System.out.println("Enter the elements of the array ::"); for(int i=0; iSystem.out.println("The array created is ::"+Arrays.toString(myArray)); for(int i=0; i > > System.out.println("Array after removing elements ::"+Arrays.toString(myArray)); > >

Вот, как это будет работать:

 
Enter the size of the array that is to be created :: 6 Enter the elements of the array :: 232 232 65 47 89 42 The array created is :: [232, 232, 65, 47, 89, 42] Array after removing elements :: [232, 65, 47, 89, 42]

На этом всё, надеемся, предоставленная информация была полезной!

Источник

Оцените статью