2016-11-24 2 views
0

У меня есть два богатых picklists, чей выделенный раздел или целевые значения должны быть взаимоисключающими. Я сделал этот кусок кода: -Исключение одновременной модификации при попытке отредактировать выбранные элементы богатого списка выбора

LinkedHashMap<String,Boolean> includeRatePlans = getCampaign().getDataPackages(); 
    LinkedHashMap<String, Boolean> excludeRatePlans = getCampaign().getSmsPackage(); 
    for (String excludeRatePlan : excludeRatePlans.keySet()){ 
     if(excludeRatePlans.get(excludeRatePlan)){ 
      for (String includeRatePlan : includeRatePlans.keySet()){ 
       if (includeRatePlans.get(includeRatePlan)) 
        if (includeRatePlan.equals(excludeRatePlan)){ 
         getCampaign().getSmsPackage().remove(excludeRatePlan); 
       } 
      } 
     } 
    } 

Но я получаю java.util.ConcurrentModificationException

+1

Ну да, вы удаляете элементы из коллекции, итерации по этой коллекции. Либо используйте итератор напрямую, либо создайте список элементов для удаления, а затем удалите их все потом. –

ответ

1

Вы не можете изменить структуру карты (то есть добавление или удаление записей), а итерация над ним с расширенной цикл (и итерация по keySet() не имеет значения).

Вы можете использовать явный итератор для удаления записей:

LinkedHashMap<String,Boolean> includeRatePlans = getCampaign().getDataPackages(); 
LinkedHashMap<String, Boolean> excludeRatePlans = getCampaign().getSmsPackage(); 
Iterator<String> iter = excludeRatePlans.keySet().iterator(); 
while (iter.hasNext()) { 
    String excludeRatePlan = iter.next(); 
    if(excludeRatePlans.get(excludeRatePlan)) { 
     for (String includeRatePlan : includeRatePlans.keySet()){ 
      if (includeRatePlans.get(includeRatePlan)) 
       if (includeRatePlan.equals(excludeRatePlan)){ 
        iter.remove(); 
      } 
     } 
    } 
} 

Это будет работать, так как excludeRatePlans относится к тому же Map, как getCampaign().getSmsPackage() и удалению элемента из KeySet в Map также удаляет соответствующую запись из Map.