2015-11-05 39 views
0

我想遍历一个Multimap,并根据任意检查删除一些键和它们的值。Java番石榴:迭代和删除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:下一个()自上次调用以去除未()的调用。 我试图像下面的代码一样玩弄它,但是在几次迭代之后,我仍然得到相同的错误。

Iterator<Integer> i = myMultimap.keySet().iterator(); 
while (i.hasNext()) { 
    if (random.nextDouble() < p) { 
     i.remove(); 
     i.next(); 
    } else { 
     i.next(); 
    } 
} 

回答

3

在创建迭代器,它指向以前的第一要素。您必须先致电next(),然后才能致电remove()以推进迭代器(即使您不需要该元素)。 remove()将影响通过next()调用返回的元素。

0

您可以遍历地图并保存所有要在列表中删除的键。

Iterator<Integer> i = myMultimap.keySet().iterator(); 
List<Integer> keyList = new ArrayList<Integer>(); 
while (i.hasNext()) { 
    if (random.nextDouble() < p) 
     keyList.add(i); 
} 

,然后从地图列表中的每一个条目:

for (Integer key : keyList) 
    myMultimap.remove(key);