簡體   English   中英

Java Guava:在迭代時從Multimap中刪除並放回元素

[英]Java Guava: Remove and put back elements from Multimap while iterating

我想要實現的是:在迭代Multimap<K,V>的鍵和值時,我想從這個列表中刪除並放回元素。 我嘗試過的任何方法最終都會出現在ConcurrentModificationException中。 這種刪除和放回方法是實現回溯搜索所必需的(參見此處: 使用啟發式實現回溯搜索?

這可能看起來像:

Multimap<K,V> multimap = HashMultimap.create();
Iterator keyIterator = multimap.keySet().iterator();

while(keyIterator.hasNext()) {
  K key = keyIterator.next();
  Collection values = multimap.get(key);

  Iterator valueIterator = values.iterator();
  while(valueIterator.hasNext()) {
    V myValue = valueIterator.next();
    if(special) {
      valueIterator.remove();
      keyIterator.remove();
      // recursion
      // put back Collection with key but without myValue <-- HOW?
    }
  }
}

一種解決方案是迭代keySet的副本,例如

K[] array = multiMap.keySet().toArray(new K[0]);
for(int i = 0; i < array.length; i++) {
    K key = array[i];
    ...
}

對底層映射的更改不會反映在array ,因此如果對其使用Iterator ,則不會得到ConcurrentModificationException如果使用for循環Iterator它,則不會產生任何奇怪的行為。

另一個選擇是將MultiMap的源代碼復制粘貼到新的集合MyMultiMap ,除了用ConcurrentHashMap替換頂級HashMap - 后者的迭代器不會拋出ConcurrentModificationExceptions

另一個選擇是將兩個循環合並為一個循環,並直接遍歷map的entries - 這樣你只有一個迭代器,所以你不會遇到一個迭代器在第二個迭代器中導致ConcurrentModificationExceptions的問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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