Массивы java удаление элемента

Удаление элемента из массива в 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 .

Источник

Как удалить элемент массива в 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]

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

Источник

10 часто используемых приёмов для работы с массивом в Java

Java-университет

10 часто используемых приёмов для работы с массивом в Java - 1

Следующие 10 приёмов для массивов в Java являются часто используемыми. Они имеют самый высокий рейтинг в Stack Overflow – системе вопросов и ответов о программировании.

    Объявление массива
 String[] aArray = new String[5]; String[] bArray = ; String[] cArray = new String[]; 
 int[] intArray = < 1, 2, 3, 4, 5 >; String intArrayString = Arrays.toString(intArray); // print directly will print reference value System.out.println(intArray); // [I@7150bd4d System.out.println(intArrayString); // [1, 2, 3, 4, 5] 
 String[] stringArray = < "a", "b", "c", "d", "e" >; ArrayList arrayList = new ArrayList(Arrays.asList(stringArray)); System.out.println(arrayList); // [a, b, c, d, e] 
 String[] stringArray = < "a", "b", "c", "d", "e" >; boolean b = Arrays.asList(stringArray).contains("a"); System.out.println(b); // true 
 int[] intArray = < 1, 2, 3, 4, 5 >; int[] intArray2 = < 6, 7, 8, 9, 10 >; // Apache Commons Lang library int[] combinedIntArray = ArrayUtils.addAll(intArray, intArray2); 
 // containing the provided list of elements // Apache common lang String j = StringUtils.join(new String[] < "a", "b", "c" >, ", "); System.out.println(j); // a, b, c 
 String[] stringArray = < "a", "b", "c", "d", "e" >; ArrayList arrayList = new ArrayList(Arrays.asList(stringArray)); String[] stringArr = new String[arrayList.size()]; arrayList.toArray(stringArr); for (String s : stringArr) System.out.println(s); 
 Set set = new HashSet(Arrays.asList(stringArray)); System.out.println(set); //[d, e, b, c, a] 
 int[] intArray = < 1, 2, 3, 4, 5 >; ArrayUtils.reverse(intArray); System.out.println(Arrays.toString(intArray)); //[5, 4, 3, 2, 1] 
 int[] intArray = < 1, 2, 3, 4, 5 >; int[] removed = ArrayUtils.removeElement(intArray, 3);//create a new array System.out.println(Arrays.toString(removed)); 

И еще — создание массива типа byte на основе значения типа int (прим. берем ByteBuffer , выделяем в нем 4 байта и кладем число int 8, затем все это (0, 0, 0, 8) преобразуем в массив типа byte с помощью вызова array() )

 byte[] bytes = ByteBuffer.allocate(4).putInt(8).array(); for (byte t : bytes)

Источник

Читайте также:  Система регистрации в html
Оцените статью