我正在用Java编写这个程序,而且我得到了一个java.util.ConcurrentModificationException。代码摘录如下,如果需要更多代码,请告诉我。
for (String eachChar : charsDict.keySet()) {
if (charsDict.get(eachChar) < 2) {
charsDict.remove(eachChar);
}
}
charsDict
定义为
Map<String, Integer> charsDict = new HashMap<String, Integer>();
请帮帮我:)。
答案 0 :(得分:6)
使用迭代器时,不允许从地图中删除元素。
解决此问题的典型解决方案:
List<String> toBeDeleted = new ArrayList<String>();
for (String eachChar : charsDict.keySet()) {
if (charsDict.get(eachChar) < 2) {
toBeDeleted.add(eachChar);
}
}
for (String eachChar : toBeDeleted) {
charsDict.remove(eachChar);
}
答案 1 :(得分:5)
您需要使用迭代器的remove
方法:
for (Iterator<String> it = charsDict.keySet().iterator(); it.hasNext();) {
String eachChar = it.next();
if (charsDict.get(eachChar) < 2) {
it.remove();
}
}
另请注意,由于您需要访问密钥和值,因此使用entrySet
代替会更有效:
for (Iterator<Map.Entry<String, Integer>> it = charsDict.entrySet().iterator(); it.hasNext();) {
Map.Entry<String, Integer> e = it.next();
String eachChar = e.getKey();
int value = e.getValue();
if (value < 2) {
it.remove();
}
}
最后看来实际上没有使用该键,所以循环变为:
for (Iterator<Integer> it = charsDict.values().iterator(); it.hasNext();) {
if (it.next() < 2) {
it.remove();
}
}
答案 2 :(得分:-2)
使用ConcurrentHashMap可能是一个更好的选择,如果在线程之间传播... Iterator不是线程安全的,你应该创建一个新的迭代器,在线程之间使用相同的。