Получение исключения одновременной модификации даже после использования итератора

Рассмотрим следующий код:

 if(!unmatchedNewTruckRequirementSet.isEmpty()){
        for(Iterator<TruckRequirement> iterator = unmatchedNewTruckRequirementSet.iterator(); iterator.hasNext();){
            TruckRequirement newTruckRequirement = iterator.next();
            for(Iterator<TruckRequirement> iterator1 = oldTruckRequirementSet.iterator(); iterator1.hasNext();){
                TruckRequirement oldTruckRequirement1 = iterator1.next();
                if(oldTruckRequirement1.getTruckClassName().equals(newTruckRequirement.getTruckClassName())) {
                    LogUtil.logInfo("Truck Requirement Changed ", "Truck Requirement Changed : From : {0} to {1} where Truck Class is: {2}",
                            new Object[]{oldTruckRequirement1.getNumberOfTrucks(), newTruckRequirement.getNumberOfTrucks(), newTruckRequirement.getTruckClassName()});
                    unmatchedNewTruckRequirementSet.remove(newTruckRequirement);
                }
            }LogUtil.logInfo("Truck Requirement Added ", "New Truck Requirement Added with Truck Class : {0} and number of Trucks : {1}",
                    new Object[]{newTruckRequirement.getTruckClassName(), newTruckRequirement.getNumberOfTrucks()});

    }else {
        if(oldTruckRequirementSet.size() > unmatchedNewTruckRequirementSet.size()){
            for(TruckRequirement truckRequirement : oldTruckRequirementSet) {
                LogUtil.logInfo("Truck Requirement Removed ", "Truck Requirement Removed with Truck Class : {0}",
                        new Object[]{truckRequirement.getTruckClassName()});
            }
        }
    }

Я использовал итератор для перебора двух хэш-наборов: unmatchedNewTruckRequiremnetSet, а другой — oldTruckRequirementSet. Когда я пытаюсь удалить набор из unmatchedNewTruckRequiremnetSet, я получаю исключение одновременной модификации. Пожалуйста помоги.


person Nagendra Singh    schedule 28.07.2015    source источник


Ответы (1)


Вы получите ConcurrentModificationException, если будете использовать метод Collection.remove или add во время цикла.

Вы должны использовать Iterator.remove(), чтобы удалить и избежать исключения.

for(Iterator<TruckRequirement> iterator1 = oldTruckRequirementSet.iterator(); iterator1.hasNext();){
    TruckRequirement oldTruckRequirement1 = iterator1.next();
    if(oldTruckRequirement1.getTruckClassName().equals(newTruckRequirement.getTruckClassName())) {
        LogUtil.logInfo("Truck Requirement Changed ", 
                "Truck Requirement Changed : From : {0} to {1} where Truck Class is: {2}",
                new Object[]{oldTruckRequirement1.getNumberOfTrucks(), 
                newTruckRequirement.getNumberOfTrucks(), newTruckRequirement.getTruckClassName()});

        // Use the iterator to remove
        iterator1.remove();
    }
}
person shazin    schedule 28.07.2015
comment
Но мне нужно удалить требование к грузовику, которое имеет совпадающие имена классов. то есть iterator1.remove(), но нужно удалить этот конкретный грузовик. - person Nagendra Singh; 28.07.2015
comment
Он удалит тот, который возвращается методом iterator1.next(). Прочтите JavaDoc docs.oracle.com/ javase/7/docs/api/java/util/ - person shazin; 28.07.2015