我正在尝试迭代 Multimap 并根据任意检查删除一些键及其值。
Multimap<Integer, Character> myMultimap = ArrayListMultimap.create();
myMultimap.keySet().stream().forEach((bin) -> {
if (random.nextDouble() < p) {
myMultimap.removeAll(bin);
}
});
这显然会引发 ConcurrentModificationException。
所以我尝试了:
Iterator<Integer> i = myMultimap.keySet().iterator();
while (i.hasNext()) {
if (random.nextDouble() < p) {
i.remove();
}
}
然而,这会导致 java.lang.IllegalStateException:自上次调用remove()以来没有调用next()。 我尝试像下面的代码一样使用它,但经过几次迭代后我仍然遇到相同的错误。
Iterator<Integer> i = myMultimap.keySet().iterator();
while (i.hasNext()) {
if (random.nextDouble() < p) {
i.remove();
i.next();
} else {
i.next();
}
}
最佳答案
创建迭代器时,它指向第一个元素之前。您必须先调用 next()
,然后才能调用 remove()
来推进迭代器(即使您不需要该元素)。 remove()
将影响调用 next()
返回的元素。
关于Java Guava : Iterating and removing keys of Multimap,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33540177/