Удаление повторяющихся объектов в Java ArrayList вызывает ошибку одновременной модификации

Возможный дубликат:
Исключение одновременного изменения: добавление в ArrayList

Я пытаюсь удалить повторяющиеся значения из массива с помощью этого метода:

 public void hasDuplicates(List<Artifact> p_cars) {
    final List<String> usedNames = new ArrayList<String>();
    for (Artifact car : p_cars) {
        final String name = car.getObjectId();

        if (usedNames.contains(name)) {
            p_cars.remove(car);

        }

        usedNames.add(name);
    }

}

Как я могу удалить эти повторяющиеся значения без одновременного изменения массива?

Я делаю это на массиве, который заполняет список, если это помогает с контекстом.

Спасибо!


person Atma    schedule 17.05.2012    source источник
comment
Дополнительное примечание: метод должен называться removeDuplicates, и он должен использовать Set‹String› для отслеживания используемых имен.   -  person JB Nizet    schedule 17.05.2012
comment
То, что сказал @JB... или usedNames.add(name) должно быть в блоке else { }.   -  person Dilum Ranatunga    schedule 17.05.2012
comment
@Dilum: размещение его в блоке else все равно приведет к поиску O (n), а не O (1) с HashSet. Набор — это естественный выбор для уникальных значений.   -  person JB Nizet    schedule 17.05.2012


Ответы (1)


Вы не можете изменить коллекцию во время ее повторения. Единственным исключением является использование метода удаления итератора:

 public void hasDuplicates(List<Artifact> p_cars) {
    final List<String> usedNames = new ArrayList<String>();
    Iterator<Artifact> it = p_cars.iterator();
    while (it.hasNext()) {
        Artifact car = it.next();
        final String name = car.getObjectId();

        if (usedNames.contains(name)) {
            it.remove();

        } else {
            usedNames.add(name);
        }
    }

}
person Pablo    schedule 17.05.2012
comment
Это правильный способ изменить коллекцию, которую вы повторяете. Однако для этого варианта использования нам нужно знать, насколько велик p_cars и сколько ожидается дубликатов. - person Dilum Ranatunga; 17.05.2012