Java Guava : Iterating and removing keys of Multimap

标签 java loops guava multimap

我正在尝试迭代 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/

相关文章:

java - Android Activity生命周期: when to save the Logcat into a file?

javascript - 使用 JavaScript 将数据插入数组

python - 如何在python循环中不断增加变量数量

java - 从嵌套流中收集对象集

java - 如何使用 XMLHttpRequest 从 java 服务器接收压缩的 JSON 数据

java - codingBat repeatEnd 使用正则表达式

javascript - Jquery,检查数组中是否存在一个值

java - 更正 ClassToInstanceMap 的泛型类型

java - 如何对 Guava 多图进行排序? (关键=日期)

java - 如果缺少参数,Spring 4.1.5 MVC @RequestParam(required = false, value = "somevalue") 失败