2017-04-25 86 views
-1
private List<String> duplicateParamList(Map<DistName, List<String>> totalHashMap, Map.Entry<String, String> param, 
              Map.Entry<DistName, ManagedObject> entry) { 
    List<String> duplicateList = new ArrayList<>(); 
    if (totalHashMap.isEmpty()) { 
     List<String> values = new ArrayList<>(); 
     values.add(param.getValue()); 
     totalHashMap.put(entry.getKey(), values); 
     return duplicateList; 
    } 

    for (Map.Entry<DistName, List<String>> totalEntry : totalHashMap.entrySet()) { 
     if (totalEntry.getValue().contains(param.getValue())) { 
     duplicateList.add(param.getKey()); 
     } else { 
     if (totalHashMap.containsKey(entry.getKey())) { 
      totalHashMap.get(entry.getKey()).add(param.getValue()); 
     } else { 
      List<String> valueList = new ArrayList<>(); 
      valueList.add(param.getValue()); 
      totalHashMap.put(entry.getKey(), valueList); 
     } 
     } 
    } 
    return duplicateList; 
    } 

它會拋出這個異常: java.lang.reflect.InvocationTargetException --- java.util.ConcurrentModificationException如何修復異常java.util.ConcurrentModificationException

如何解決這個問題呢?非常感謝。

這是我使用迭代器來代替了,但它也沒有有效:

Iterator<Map.Entry<DistName, List<String>>> iterator = totalHashMap.entrySet().iterator(); 

while (iterator.hasNext()) { 
    Map.Entry<DistName, List<String>> totalEntry = iterator.next(); 
    if (totalEntry.getValue().contains(param.getValue())) { 
    duplicateList.add(param.getKey()); 
    } else { 
    if (totalHashMap.containsKey(entry.getKey())) { 
     totalHashMap.get(entry.getKey()).add(param.getValue()); 
    } else { 
     List<String> valueList = new ArrayList<>(); 
     valueList.add(param.getValue()); 
     totalHashMap.put(entry.getKey(), valueList); 
    } 
    } 
} 
+0

它不重複,因爲我的迭代器是totalHashMap,使用Iterator也沒有效果。 – danny

+0

我用迭代器更新代碼 – danny

回答

0

擺脫循環內的totalHashMap.put通話和CME會自行消失。用迭代器在結構上修改集合時不能同時運行它。併發修改會擾亂迭代器,並且導致異常情況的併發修改會產生ConcurrentModificationException

相關問題