Удаление человека из arrayList

У меня есть класс под названием person, который содержит такую ​​информацию о человеке, как его имя, возраст и адрес. У меня также есть еще один класс, в котором есть ArrayList, куда добавляются все клиенты. Как мне найти человека по имени и удалить его?

вот мой код, но он не работает.

public void poistaAsiakas(String poistettava) {
    for (Henkilo p : this.henkilonTiedot) {
        if (p.getNimi().equals(poistettava)) {
            this.henkilonTiedot.remove(p); // or simply return it from there
            break;
        }
    }
}

person Kurosh Husseini    schedule 13.08.2020    source источник


Ответы (1)


Вы не можете удалить из List, перебирая его с помощью для каждого цикла. Вместо этого вы можете использовать Collection#removeIf:

this.henkilonTiedot.removeIf(p -> p.getNimi().equals(poistettava));

Как правило, использование Iterator - это лучший способ удалить элементы во время итерации.

for(final Iterator<Henkilo> it = this.henkilonTiedot.iterator(); it.hasNext();){
    final Henkilo p = it.next();
    if(p.getNimi().equals(poistettava)){
        it.remove();
        break;
    }
}

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

for(int i = 0; i < this.henkilonTiedot.size(); i++){
    if (this.henkilonTiedot.get(i).getNimi().equals(poistettava)){
        this.henkilonTiedot.remove(i);
        break;
    }
}
person Unmitigated    schedule 13.08.2020
comment
Iterator - это правильный путь, а не поощрение модели индекса, которая устареет и вызовет ошибки позже. - person chrylis -cautiouslyoptimistic-; 13.08.2020
comment
@ chrylis-cautiouslyoptimistic- Это правда. Я отредактировал свой ответ. - person Unmitigated; 13.08.2020
comment
Цикл for на основе индекса также будет работать, если когда-либо будет удален только один элемент. Вы можете выполнить несколько удалений из цикла for, основанного на индексе, если вы сделаете это в обратном порядке. - person WJS; 13.08.2020
comment
@WJS Я понимаю это, но не думаю, что в данном случае это важно. - person Unmitigated; 13.08.2020