Как удалить элемент из списка
Короткий ответ
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 — Объект, который по одному выдаёт элементы коллекции.