67. Удалить строки, начинающиеся с abc, через Iterator
Условие задачи:
Необходимо удалить из переданной коллекции все строки, начинающиеся с "abc".
Ограничения:
нельзя создавать новую коллекцию;
нельзя использовать
removeIf()и предикаты;решение должно работать на Java 8.
Код:
void foo(Collection<String> strings) {
// код тут
}
Спойлеры к решению
Подсказки
💡 Удаление элементов внутри цикла
💡 Обходи коллекцию через
💡 Для удаления текущего элемента используй
💡 Перед вызовом
for-each может привести к ConcurrentModificationException.💡 Обходи коллекцию через
Iterator.💡 Для удаления текущего элемента используй
iterator.remove().💡 Перед вызовом
startsWith() проверь строку на null.Решение
void foo(Collection<String> strings) {
if (strings == null) {
throw new IllegalArgumentException(
"Collection must not be null"
);
}
Iterator<String> iterator = strings.iterator();
while (iterator.hasNext()) {
String value = iterator.next();
if (value != null && value.startsWith("abc")) {
iterator.remove();
}
}
}
Метод изменяет исходную коллекцию и не создаёт дополнительную.
Удаление выполняется через итератор, поэтому обход не нарушается:
iterator.remove();
Коллекция должна поддерживать удаление элементов. Для неизменяемой коллекции метод может выбросить UnsupportedOperationException.
Временная сложность — O(n), дополнительная память — O(1).