惯用的方式来遍历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));
}
感谢清理增加的原因不支持。我还需要允许添加,并且愿意失去迭代保证。我猜如果没有挖掘源码,就没有办法呢? –
你可以使用另一个lib,其中一些可能不会抛出'ConcurrentModificationException'(AFAIR hppc声称它不会隐藏任何细节,基本上允许任何,甚至不安全的使用)。 – leventov