2016-11-24 50 views
0

我有兩個豐富的選項列表,其中選定的項目部分或目標值必須互斥。我做了這段代碼: -嘗試編輯富選項選擇項的併發修改異常

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

您不能修改地圖的結構(即添加或刪除條目),而遍歷它與增強的for循環(和迭代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這將工作指的是相同的MapgetCampaign().getSmsPackage()以及除去MapKeySet元素也將刪除相應的條目Map