簡體   English   中英

Java Guava:迭代和刪除 Multimap 的鍵

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM