Скажем, я делаю что-то вроде:
for (X x : some_map.values ())
doSomething (x);
где doSomething()
косвенно через несколько слоев кода добавляет больше значений к some_map
. С итераторами (как в приведенном выше примере кода) мне бросают ConcurrentModificationException
в лицо.
Я могу сделать some_map
LinkedHashMap
, то есть иметь предсказуемый порядок итераций. Кроме того, когда к нему добавляется новый элемент, он всегда добавляется в конце порядка итераций. Другими словами, если ConcurrentModificationException
каким-то образом не было выброшено, цикл будет просто перебирать только что добавленные элементы в конце, т. е. будет работать отлично. Или, другими словами, у меня есть параллельная модификация, но я могу гарантировать, что ее поведение четко определено и не является ошибкой.
Вопрос: есть ли что-то "похожее" на итераторы, которые я мог бы использовать в приведенном выше цикле, чтобы избежать исключений одновременного изменения?
Обратите внимание, что из-за некоторых дополнительных ограничений я не могу указать, где добавляются элементы, с учетом цикла. Я также не могу изменить это на что-то, что не является картой. Это всего лишь один фрагмент кода, но some_map
также используется в других местах и не просто так является картой.
EDIT: Мой вопрос заключается в том, могу ли я повторять (не обязательно стандартным способом) ту же карту, на которую я добавляю элементы. Очевидно, что вместо этого я могу перебирать копию, после цикла сравнивать указанную копию с оригиналом, чтобы найти новые элементы, перебирать их и так далее. Вопрос в том, могу ли я полностью избежать этого, потому что в моем случае единственная проблема заключается в чрезмерном бросании ConcurrentModificationException
. Ответ «нет, вы не можете» для меня лучше, чем «вы можете сделать… вместо этого», потому что я могу сам придумать для этого альтернативный код. Мне просто интересно, не пропустил ли я какое-то элегантное решение.
doSomething()
добавляет запись на карту, вы хотите, чтобы ваш цикл также повторялся для этого значения? Т.е. вы хотите, чтобы ваша итерация увидела изменения в вашей карте. Если да, то как насчет изменения значения записи и удаления? - person Bohemian♦   schedule 08.11.2016LinkedHashMap
) этого не знает и выдаетConcurrentModificationException
, потому что предполагает, что модификация была неправильной. - person doublep   schedule 08.11.2016