Encodera

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.

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

Короткий ответ

remove() удаляет элемент по значению или по индексу:

void main() {
    var colors = new ArrayList<>(List.of("red", "green", "blue"));
    colors.remove("green");
    colors.remove(0);
 
    IO.println(colors);
}

Результат:

[blue]

По условию

removeIf() удаляет все элементы, для которых условие истинно:

void main() {
    var numbers = new ArrayList<>(List.of(1, 2, 3, 4, 5, 6));
    numbers.removeIf(n -> n % 2 == 0);
 
    IO.println(numbers);
}

Результат:

[1, 3, 5]

Несколько значений

removeAll() удаляет все элементы, которые есть в другой коллекции:

void main() {
    var tags = new ArrayList<>(List.of("java", "spam", "sql", "ads"));
    tags.removeAll(Set.of("spam", "ads"));
 
    IO.println(tags);
}

Результат:

[java, sql]

Список чисел

У List<Integer> вызов remove(1) удаляет элемент по индексу 1, а не число 1. Чтобы удалить значение, передайте объект:

void main() {
    var numbers = new ArrayList<>(List.of(5, 1, 7));
 
    numbers.remove(Integer.valueOf(1));
    IO.println(numbers);
 
    numbers.remove(1);
    IO.println(numbers);
}

Результат:

[5, 7]
[5]

Частая ошибка

Удалять элементы в цикле for-each. Список меняется во время обхода, и Java выбрасывает исключение:

void main() {
    var names = new ArrayList<>(List.of("Anna", "", "Oleg", ""));
    for (String name : names) {
        if (name.isEmpty()) {
            names.remove(name);
        }
    }
}

Результат:

Exception in thread "main" java.util.ConcurrentModificationException

Используйте removeIf() или явный Iterator с iterator.remove().

Функции из этого ответа

  • List.remove() — Удаляет элемент списка по индексу или по значению.
  • Collection.removeIf() — Удаляет из коллекции все элементы, подходящие под условие.
  • Iterator — Объект, который по одному выдаёт элементы коллекции.

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.