2

我正在用 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>();

请帮我 :)

4

3 回答 3

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);
}
于 2013-03-22T11:21:41.263 回答
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();
    }
}

最后似乎key 实际上没有使用,所以循环变为:

for (Iterator<Integer> it = charsDict.values().iterator(); it.hasNext();) {
    if (it.next() < 2) {
        it.remove();
    }
}

另请参阅此相关帖子

于 2013-03-22T11:32:31.510 回答
-2

如果线程之间是 sahred,则使用 ConcurrentHashMap 可能是一个更好的选择……迭代器不是线程安全的,您应该创建一个新的迭代器,以便在线程之间使用相同的迭代器。

于 2013-03-22T11:23:12.120 回答