0

メソッド test() があります。このメソッドでは、2 つの LinkedHashMap を互いに比較し、両方の LHM で見つかった場合はキーと値のペアを削除して、マップの 1 つの内容を変更しようとしています。このメソッドを実行すると、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 に答える
0

EntrySet の反復子を使用するか、重複したすべてのキーを別のリストに保存し、後でそれらをマップから削除できます。また、== を使用してオブジェクトを比較しないでください。equals() 関数を使用してください。

于 2013-04-04T12:55:52.537 に答える