On Wed, 5 Aug 2009, Daniel Pitts wrote:
Eric Sosman wrote:
Daniel Pitts wrote:
[...]
What I would *love* is an iterator that can be made smart enough to
not throw ConcurrentModificationException if the modification can be
proven to be non-conflicting (such as appending to a list, or
removing a node from a linked-list, which is not any node being
pointed to by the iterator.)
Can you give some examples of situations where you've wished you
had such a thing?
I have a simulation involving robots which can shoot at each other.
Once a robot is destroyed, it is removed from the list. At the time
that damage is dealt, I am already iterating through that list.
This means that I must go through the list afterward and remove the
dead robots, instead of removing them as they die.
This is a simplified example. The list itself may contain other
objects (such as missiles, mines, etc...) each of which may cease to
exist and/or inflict damage at any time.
I had exactly that problem many years ago, only it was spaceships
instead of robots.
How about something like:
Collection<Thing> things; // robots, missiles, mines, etc
void carryOutATurn() {
List thingsToDo = new LinkedList(things);
while (!thingsToDo.isEmpty()) {
Thing next = thingsToDo.remove(0);
Collection<Thing> casualties = next.takeTurn();
if (!casualties.isEmpty()) {
things.removeAll(casualties);
thingsToDo.removeAll(casualties);
}
}
}
This does involve creating and throwing away a linked list of everything
in the universe on every turn, and potentially a lot of little casualty
lists too - although these can be emptySet or singleton sets from
Collections, which are very cheap.
It would be straightforward to extend this to handle new things (a
newly-fired missile, etc) as well.