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();
    }
}

そして最後に、キーが実際には使用されていないように見えるため、ループは次のようになります。

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

この関連記事も参照してください。

于 2013-03-22T11:32:31.510 に答える
-2

スレッド間で共有する場合は、ConcurrentHashMap を使用することをお勧めします... Iterator はスレッドセーフではないため、スレッド間で同じものを使用する代わりに、新しい反復子を作成する必要があります。

于 2013-03-22T11:23:12.120 に答える