Как удалить элемент из массива java
Перейти к содержимому

Как удалить элемент из массива java

  • автор:

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

Когда мы создаем массив в Java, мы указываем его тип данных и размер. Это используется JVM для выделения необходимой памяти для элементов массива. Не существует специальных методов удаления элементов из массива.

1. Удаление элемента из массива с помощью цикла for

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

package com.journaldev.java; import java.util.Arrays; public class Main < public static void main(String[] args) < int[] arr = new int[]; int[] arr_new = new int[arr.length-1]; int j=3; for(int i=0, k=0;i > System.out.println("Before deletion :" + Arrays.toString(arr)); System.out.println("After deletion :" + Arrays.toString(arr_new)); > > 

Код удаляет элемент с индексом 3. Этот метод просто копирует все элементы, кроме элемента с индексом 3, в новый массив.

2. Удаление элемента массива по его значению

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

package com.journaldev.java; import java.util.Arrays; public class Main < public static void main(String[] args) < int[] arr = new int[]; int[] arr_new = new int[arr.length-1]; int j=3; for(int i=0, k=0;i > System.out.println("Before deletion :" + Arrays.toString(arr)); System.out.println("After deletion :" + Arrays.toString(arr_new)); > > 

Единственная разница между этим и предыдущим случаем заключается в arr[i]!=j в условии if вместо i!=j .

3. Удаление элемента по его значению, когда массив содержит дубликаты

Выполнение удаления на основе значения в случае дублирования требует использования ArrayList. Поскольку ArrayList не требует указания размера заранее, он позволяет нам динамически расширяться.

package com.journaldev.java; import java.util.ArrayList; import java.util.Arrays; public class Main < public static void main(String[] args) < int[] arr = new int[]; ArrayList arr_new = new ArrayList<>(); int j=3; for(int i=0;i > System.out.println("Before deletion :" + Arrays.toString(arr)); System.out.println("After deletion :" +arr_new); > > 

4. Сдвиг элементов в одном массиве

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

package com.journaldev.java; import java.util.Arrays; public class Main < public static void main(String[] args) < int[] arr = new int[]; int j=3; System.out.println("Before deletion :" + Arrays.toString(arr)); int count =0; for(int i = 0; i < arr.length; i++)< if(arr[i] == j)< count++; // shifting elements for(int k = i; k < arr.length - 1; k++)< arr[k] = arr[k+1]; >i--; // break; > > System.out.print("After Deletion :" ); for(int i = 0; i < arr.length-count; i++)< System.out.print(" " + arr[i]); >System.out.println(); System.out.println("Whole array :" + Arrays.toString(arr)); > > 

Переменная Count указывает количество удаленных элементов. Эта переменная необходима для отслеживания индекса, по которому должен быть напечатан массив. Этот метод также работает с дубликатами.

5. Удаление элементов из ArrayList

ArrayList поддерживается массивами. Удаление элемента в ArrayList выполняется прямолинейно. Для этого требуется один простой вызов встроенной функции.

package com.journaldev.java; import java.util.ArrayList; import java.util.Arrays; public class Main < public static void main(String[] args) < int[] arr = new int[]; ArrayList arr_new = new ArrayList(); for (int i : arr) < arr_new.add(i); >arr_new.remove(3); System.out.println("Before deletion :" + Arrays.toString(arr)); System.out.println("After Deletion:" + arr_new); > > 

Вызов функции remove(i) удаляет элемент с индексом i. Удаление в ArrayLists относительно проще по сравнению с массивами.

Заключение

Мы видели несколько примеров удаления элементов в массиве с использованием различных методов. Разница между удалением элемента в Array и ArrayList очевидна. Если удаление должно выполняться снова и снова, следует использовать ArrayList, чтобы извлечь выгоду из его встроенных функций. То же самое и с добавлением элементов в массив. ArrayList благодаря своей динамической природе предоставляет более простые и менее громоздкие способы изменения массива.

Все права защищены. © Linux-Console.net • 2019-2024

Rukovodstvo

статьи и идеи для разработчиков программного обеспечения и веб-разработчиков.

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

Введение В этом руководстве будут рассмотрены некоторые общие методы удаления элементов из массивов Java. Управление элементами массива — чрезвычайно распространенная задача, поскольку ее обсуждения можно найти на многих форумах, особенно на StackOverflow. Вот список техник и методов, которые мы рассмотрим в этой статье: * Использование двух массивов * ArraysUtils.remove () * Использование цикла for * System.arraycopy () Краткое описание массивов Массивы — это структуры данных, общие для многих языки программирования

Время чтения: 5 мин.

Вступление

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

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

  • Использование двух массивов
  • ArraysUtils.remove ()
  • Использование цикла for
  • System.arraycopy ()

Краткое описание массивов

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

массив java впамяти

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

Если индекс запрошенного элемента равен 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.remove ()

Если вы уже используете библиотеку 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

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

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

 int[] array = ; int index = 3; 

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

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

 for (int i = index; i

Если бы мы пошли и напечатали модифицированный массив, результат был бы следующим:

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

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

Вы можете переопределить его фиктивным значением, например -1 , но это решение не очень верное. Это устраняется использованием двух массивов .

System.arraycopy

Сокращенный способ сделать то же самое, что и раньше, но в одной строке кода — это System.arraycopy() :

 public static void arraycopy(Object src, int srcPos, Object dest, int destPos, int length); 

Метод принимает исходный массив и позицию, с которой начинается копирование. Он также принимает целевой массив и позицию, в которую следует начать копирование. Последний аргумент — это количество элементов, которые нужно скопировать из исходного массива.

arraycopy обычно используется для копирования содержимого из некоторого исходного массива в некоторый целевой массив. Хотя мы также можем скопировать массив или его часть в себя. Это позволяет нам сдвинуть его часть влево, как в прошлый раз:

 int[] array = ; int index = 3; 

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

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

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

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

Заключение

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

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

Licensed under CC BY-NC-SA 4.0

Удаление элементов массива — Java: Массивы

В Java не существует простого способа удалить элемент из массива. Изменение массива трансформируется в создание нового массива, в котором отсутствуют удаляемые элементы. Ниже пример реализации метода remove() , который удаляет элемент по определенному индексу:

import java.util.Arrays; class MyArrayUtils  public static int[] remove(int[] values, int index)  // Создаем пустой массив размером на один меньше чем исходный // так как мы удаляем один элемент var result = new int[values.length - 1]; for (var i = 0; i  values.length; i++)  if (i != index)  // Копируем все кроме index // Элементы стоящие дальше index смещаются влево var newIndex = i  index ? i : i - 1; result[newIndex] = values[i]; > > return result; > > int[] numbers = 1, 5, 8, 100>; System.out.println(Arrays.toString(MyArrayUtils.remove(numbers, 2))); // => [1, 5, 100] // Исходный массив не поменялся System.out.println(Arrays.toString(numbers)); // => [1, 5, 8, 100] System.out.println(Arrays.toString(MyArrayUtils.remove(numbers, 0))); // => [5, 8, 100] 

Открыть доступ

Курсы программирования для новичков и опытных разработчиков. Начните обучение бесплатно

  • 130 курсов, 2000+ часов теории
  • 1000 практических заданий в браузере
  • 360 000 студентов

Наши выпускники работают в компаниях:

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

Давайте добавим зависимость commons-lang3 в файл pom.xml нашего проекта :

 dependency>   groupId>org.apache.commonsgroupId>   artifactId>commons-lang3artifactId>   version>3.12.0version>   dependency> 

3. Удаление элемента​

Прежде чем мы начнем, давайте посмотрим, что происходит, когда мы удаляем элемент из массива без использования класса ArrayUtils из библиотеки Apache Commons Lang.

Учитывая приведенный ниже массив, давайте удалим элемент с индексом 2 :

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

./505b642c00a499e9f733cf6f075ff549.png

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

Теперь давайте посмотрим на представление массива при удалении элемента с помощью метода удаления из класса ArrayUtils из Apache Commons Lang:

./43e5686bfdeecd567b01d97e743620fa.png

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

Класс ArrayUtils предоставляет два способа удаления элемента из массива. Давайте посмотрим на это дальше.

4. Использование индекса в качестве входных данных​

Первый способ удалить элемент — по его индексу с помощью ArrayUtils#remove :

 public int[] removeAnElementWithAGivenIndex(int[] array, int index)    return ArrayUtils.remove(array, index);   > 

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

 public int[] removeAllElementsWithGivenIndices(int[] array, int... indices)    return ArrayUtils.removeAll(array, indices);   > 

5. Использование элемента в качестве входных данных​

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

 public int[] removeFirstOccurrenceOfGivenElement(int[] array, int element)    return ArrayUtils.removeElement(array, element);   > 

Вот еще одна полезная вариация этого метода ArrayUtils#removeElements на случай, если мы хотим удалить более одного элемента:

 public int[] removeAllGivenElements(int[] array, int... elements)    return ArrayUtils.removeElements(array, elements);   > 

Иногда мы хотели бы удалить все вхождения данного элемента. Мы можем сделать это с помощью ArrayUtils#removeAllOccurences :

 public int[] removeAllOccurrencesOfAGivenElement(int[] array, int element)    return ArrayUtils.removeAllOccurences(array, element);   > 

6. Заключение​

В этой статье мы рассмотрели различные способы удаления элемента/элементов из массива с помощью библиотеки Apache Commons Lang .

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

  • 1. Обзор
  • 2. Мавен
  • 3. Удаление элемента
  • 4. Использование индекса в качестве входных данных
  • 5. Использование элемента в качестве входных данных
  • 6. Заключение

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *