1

私が達成しようとしているのは次のとおりです。 a のキーと値の両方を繰り返し処理しているときに、このリストから要素を削除して元に戻し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?
    }
  }
}
4

1 に答える 1

3

keySet1 つの解決策は、たとえばのコピーを反復処理することです。

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

基になるマップへの変更は に反映されarrayないため、ConcurrentModificationExceptionを使用しIteratorても は取得されず、 for ループで反復処理しても奇妙な動作は発生しません。

MultiMapもう 1 つのオプションは、のソース コードを新しいコレクションにコピー アンド ペーストすることMyMultiMapです。HashMapConcurrentHashMapConcurrentModificationExceptions

もう 1 つのオプションは、2 つのループを 1 つのループに結合し、マップを直接反復処理するentriesことです。この方法では、反復子が 1 つしかないため、1 つの反復子が 2 番目の反復子で発生するという問題は発生しませんConcurrentModificationExceptions

于 2013-05-19T15:18:24.003 に答える