Koloboke コレクションを変更 (キーの削除と更新、ただし追加ではない) で反復処理する慣用的な方法は、次のcursor
とおりです。
for (LongIntCursor cur = map.cursor(); cur.moveNext();) {
long key = cur.key();
int value = cur.value();
if (checkSomething(key, value)) {
cur.remove(); // remove the entry
} else {
cur.setValue(newValue); // update the value
}
}
ConcurrentModificationException
追加はサポートされていません。これは、行うのと同じ方法で をスローする必要がjava.util.HashMap
あります。その理由は、追加によって完全なマップの再ハッシュがトリガーされると、イテレーションを適切に終了できないからです。
回避策として、反復中にマップに挿入するエントリを収集し、反復後に一括挿入を実行できます。
// You could get primitive lists from fastutil, gs, hppc or trove
LongList keysToPut = keysToPutThreadLocal.get();
keysToPut.clear();
IntList valuesToPut = valuesToPutThreadLocal.get();
valuesToPut.clear();
for (LongIntCursor cur = map.cursor(); cur.moveNext();) {
long key = cur.key();
int value = cur.value();
if (checkSomething(key, value)) {
cur.remove(); // remove the entry
} else {
// want to insert a <newKey, newValue> entry
keysToPut.add(newKey);
valuesToPut.add(newValue);
}
}
// bulk insert
for (int i = 0, toPut = keysToPut.size(); i < toPut; i++) {
map.put(keysToPut.get(i), valuesToPut.get(i));
}