2015-11-05 74 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);