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

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

  • автор:

Как удалить из arraylist java

В Java для удаления элемента из ArrayList можно использовать метод remove() . Вот несколько примеров:

Удаление по индексу:

ArrayListString> list = new ArrayList<>(); list.add("apple"); list.add("banana"); list.add("cherry"); // Удаляем элемент с индексом 1 (т.е. "banana") list.remove(1); 

Удаление по значению:

ArrayListString> list = new ArrayList<>(); list.add("apple"); list.add("banana"); list.add("cherry"); // Удаляем элемент со значением "banana" list.remove("banana"); 

Удаление всех элементов, удовлетворяющих условию:

ArrayListInteger> list = new ArrayList<>(); list.add(1); list.add(2); list.add(3); list.add(2); list.add(4); // Удаляем все элементы со значением 2 list.removeIf(n -> n == 2); 

В этом примере мы используем метод removeIf() , который удаляет все элементы, удовлетворяющие заданному условию. В данном случае мы передаем лямбда-выражение n -> n == 2 , которое проверяет, равен ли элемент n значению 2.

Удалить элементы из списка при повторении его в Java

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

Не рекомендуется добавлять или удалять элементы из списка внутри цикла в качестве индекса его элементов, а также изменять длину списка. Это может привести к неправильному выводу или java.util.IndexOutOfBoundsException или же java.util.ConcurrentModificationException будет выбрано, чтобы избежать недетерминированного поведения на более позднем этапе.

Есть несколько обходных путей для решения этой проблемы. Они обсуждаются ниже:

1. Итерация в обратном направлении

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

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

Как известно, после удаления элемента из середины списка ArrayList, часть массива, которая следовала после данного элемента, перезаписывается на позицию влево, чтоб перекрыть пустую ячейку. Если стоит задача удалить несколько элементов из середины списка одной операцией (т. е. чтоб избежать многоразовой перезаписи массива), как это можно сделать?

Отслеживать
11 1 1 золотой знак 2 2 серебряных знака 8 8 бронзовых знаков
задан 19 дек 2014 в 13:50
romashechka romashechka
359 1 1 золотой знак 5 5 серебряных знаков 18 18 бронзовых знаков

4 ответа 4

Сортировка: Сброс на вариант по умолчанию

Как обычно — наследованием:

public class MyArrayList extends ArrayList  < public void remove(int startIndex, int endIndex) < //здесь и придумывайте свой гениальный код >> 

Отслеживать
ответ дан 19 дек 2014 в 14:00
81.1k 7 7 золотых знаков 72 72 серебряных знака 153 153 бронзовых знака
собственно вопрос и заключался в том, что там за алгоритм должен быть ))
19 дек 2014 в 14:04

Используйте методы removeAll и sublist . sublist — для создания коллекции (пула элементов), которую нужно удалить. А removeAll уже для удаления элементов.

public static void main(String[] args) < Listlist = new ArrayList<>(); list.add(1); list.add(2); list.add(3); list.add(4); list.add(5); list.add(6); list.add(7); list.add(8); List sublist = list.subList(2,5); // Удаляем с 2 по 4й элемент включительно list.removeAll(sublist); System.out.println(list); //[1, 2, 6, 7, 8] > > //В одну строку public static void main(String[] args) < Listlist = new ArrayList<>(); list.add(1); list.add(2); list.add(3); list.add(4); list.add(5); list.add(6); list.add(7); list.add(8); list.removeAll(list.subList(2,5)); System.out.println(list); //[1, 2, 6, 7, 8] > > 

Отслеживать
22k 3 3 золотых знака 27 27 серебряных знаков 37 37 бронзовых знаков
ответ дан 11 окт 2016 в 22:03
Andrii Horbatiuk Andrii Horbatiuk
51 1 1 серебряный знак 1 1 бронзовый знак

использовать removeAll(Collection c)
наследовать и использовать removeRange(int fromIndex, int toIndex)

Отслеживать
ответ дан 19 дек 2014 в 14:52
1,300 8 8 серебряных знаков 17 17 бронзовых знаков

Не нужно ничего наследовать, вреда от этого больше, чем пользы. Нефинальные классы контейнеров были ошибкой.

Условимся, что из списка длины n нужно удалить m элементов. Формализую вопрос: m удалений, по O(n) каждое, стоит O(m×n) ; как можно ускорить процесс?

Пользуясь тем, что ArrayList#set стоит O(1) , нужно сначала отметить все элементы как удалённые:

list.set(index, REMOVED); 

где REMOVED — это приватная константа, которая в обычных условиях в списке не окаженся:

private static final Object REMOVED = new Object(); 

Дженерики будут мешать вставке произвольных Object ов, поэтому придётся воспользоваться стиранием и сделать unchecked cast.

((List) list).set(index, REMOVED); 

После этого в листе есть посторонние элементы. Осторожно: list.get(removedIndex) приведёт к ClassCastException , подробнее — см. heap pollution.

Теперь нужно удалить все элементы, которые отмечены для удаления. Вызов list.remove(REMOVED) удалит только первое вхождение; нам нужен метод removeAll , который удалит все элементы переданной коллекции из данного списка:

list.removeAll(COLLECTION_OF_REMOVED); 
private static final Collection COLLECTION_OF_REMOVED = Collections.singleton(REMOVED); 

Это произойдёт за O(n) , после чего объектов REMOVED в списке не будет и его снова можно будет безопасно читать.

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

Например, чтобы удалить элемент с индексом 2 из ArrayList :

ArrayListString> list = new ArrayList<>(); list.add("A"); list.add("B"); list.add("C"); list.remove(2); // удаляем элемент с индексом 2 ("C") 
  1. remove(Object o) — удаляет первое вхождение указанного объекта из ArrayList

Например, чтобы удалить строку «B» из ArrayList :

ArrayListString> list = new ArrayList<>(); list.add("A"); list.add("B"); list.add("C"); list.remove("B"); // удаляем строку "B" 

Обратите внимание, что если ArrayList не содержит удаляемый элемент, метод remove() не сделает ничего и просто вернет false

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

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