[英]Java Guava: Iterating and removing keys of 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()
返回的元素。
您可以遍歷地圖並將所有要刪除的鍵保存在列表中。
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);
就像 Michael Koch 所說的,需要在remove()
之前調用next()
remove()
。 以下代碼應該可以工作。
Iterator<Integer> i = myMultimap.keySet().iterator();
while (i.hasNext()) {
i.next();
if (random.nextDouble() < p) {
i.remove();
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.