Java Guava: Remove and put back elements from Multimap while iterating -


what i'm trying achieve following: while iterating on both keys , values of multimap<k,v>, want remove and put back elements list. approach i've tried ends in concurrentmodificationexception. remove-and-put-back-approach required implement backtrack search (see here: implementing backtrack search heuristic? )

this may like:

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 collection key without myvalue <-- how?     }   } } 

one solution iterate on copy of keyset, e.g.

k[] array = multimap.keyset().toarray(new k[0]); for(int = 0; < array.length; i++) {     k key = array[i];     ... } 

changes underlying map won't reflected in array, won't concurrentmodificationexception if use iterator on it, , won't weird behavior if iterate on loop.

another option copy-paste source code multimap new collection mymultimap, except you'd replace top-level hashmap concurrenthashmap - latter's iterators won't throw concurrentmodificationexceptions.

another option coalesce 2 loops 1 loop, , iterate directly on map's entries - way you'll have 1 iterator, won't have problem of 1 iterator causing concurrentmodificationexceptions in second iterator.


Comments

Popular posts from this blog

SPSS keyboard combination alters encoding -

Add new record to the table by click on the button in Microsoft Access -

javascript - jQuery .height() return 0 when visible but non-0 when hidden -