0

我有一个方法 test(),在其中我试图将两个 LinkedHashMap 相互比较,并通过删除键/值对来修改其中一个映射的内容(如果它在两个 LHM 中都找到)。运行此方法时,我不断收到 ConcurrentModificationException。我了解为什么会出现异常(因为我正在尝试修改正在循环的列表)。但是,我不确定如何进行此操作。到目前为止我有这个代码:

private void test() {    

LinkedHashMap<String, BigDecimal>testBene = new LinkedHashMap<String, BigDecimal>();
LinkedHashMap<String, BigDecimal>testDly = new LinkedHashMap<String, BigDecimal>();

testBene.put("ABCDEFG", BigDecimal.ZERO);
testBene.put("BCDEFGH", BigDecimal.ONE);
testBene.put("CDEFGHI", BigDecimal.TEN);

testDly.put("BCDEFGH", BigDecimal.ONE);
testDly.put("Foo", BigDecimal.TEN);
testDly.put("Bar", BigDecimal.TEN);

for (Entry<String, BigDecimal> beneKeySet : testBene.entrySet()) {
    if (testDly.containsKey(beneKeySet.getKey())) {
        for (Entry<String, BigDecimal> dlyKeySet : testDly.entrySet()) {
            if ((dlyKeySet.getKey().equals(beneKeySet.getKey())) && 
                dlyKeySet.getValue().equals(beneKeySet.getValue())) {
                    testBene.remove(dlyKeySet.getKey());
            }
        }
    }
}

}
4

4 回答 4

2

不要删除元素,而是将要删除的键放入单独的集合中。最后,遍历其他集合,从地图中删除键。

或者,使用Iterator接口而不是 for-each 循环。这将使您能够Iterator.remove()在迭代时使用删除元素。

于 2013-04-04T12:55:25.423 回答
1

您不能从当前使用 for each 迭代的列表中删除。使用列表的迭代器来执行此操作。

于 2013-04-04T12:55:13.593 回答
1

您可以使用迭代器:

for (Iterator<Entry<String, BigDecimal>> it = testBene.entrySet().iterator(); it.hasNext();) {
    Entry<String, BigDecimal> beneKeySet = it.next();
    if (testDly.containsKey(beneKeySet.getKey())) {
        for (Entry<String, BigDecimal> dlyKeySet : testDly.entrySet()) {
            if ((dlyKeySet.getKey() == beneKeySet.getKey()) && dlyKeySet.getValue() == beneKeySet.getValue()) {
                it.remove();
            }
        }
    }
}
于 2013-04-04T12:59:09.160 回答
0

您可以使用 EntrySet 的迭代器,或者将所有重复的键保存在另一个列表中,然后从映射中删除它们。另外,不要使用 == 比较对象,使用 equals() 函数。

于 2013-04-04T12:55:52.537 回答