我正在用Java编写这个程序,我得到了一个java.util.ConcurrentModificationException.代码摘录如下,如果需要更多代码,请告诉我.
for (String eachChar : charsDict.keySet()) {
if (charsDict.get(eachChar) < 2) {
charsDict.remove(eachChar);
}
}
Run Code Online (Sandbox Code Playgroud)
charsDict 被定义为
Map<String, Integer> charsDict = new HashMap<String, Integer>();
Run Code Online (Sandbox Code Playgroud)
请帮我 :)
在使用迭代器时,不允许从地图中删除元素.
解决此问题的典型解决方案:
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);
}
Run Code Online (Sandbox Code Playgroud)
您需要使用remove迭代器的方法:
for (Iterator<String> it = charsDict.keySet().iterator(); it.hasNext();) {
String eachChar = it.next();
if (charsDict.get(eachChar) < 2) {
it.remove();
}
}
Run Code Online (Sandbox Code Playgroud)
还要注意的是,因为你需要访问键和值,这将是更有效地使用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();
}
}
Run Code Online (Sandbox Code Playgroud)
最后看来密钥实际上没有使用,所以循环变为:
for (Iterator<Integer> it = charsDict.values().iterator(); it.hasNext();) {
if (it.next() < 2) {
it.remove();
}
}
Run Code Online (Sandbox Code Playgroud)
另见这篇相关文章.