Удалить из коллекции строки, начинающиеся на abc

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).