У меня есть набор A = {(1,2), (1,2,3), (2,3,4), (3,4), (1)}
Я хочу превратить его в A = {(1,2,3), (2,3,4)}, удалить подходящие подмножества из этого набора.
Я использую HashSet для реализации набора, 2 итератора, чтобы пройти через набор и проверить все пары на предмет правильного условия подмножества, используя containsAll (c), и метод remove () для удаления надлежащих подмножеств.
код выглядит примерно так:
HashSet<Integer> hs....
Set<Integer> c=hs.values();
Iterator<Integer> it= c.iterator();
while(it.hasNext())
{
p=it.next();
Iterator<Integer> it2= c.iterator();
while(it2.hasNext())
{
q=it2.next();
if q is a subset of p
it2.remove();
else if p is a subset of q
{
it.remove();
break;
}
}
}
Я получаю исключение ConcurrentModificationException в первый раз, когда выхожу из внутреннего цикла while и выполняю
p=it.next();
Исключение составляют изменения коллекции при ее итерации по ней. Но для этого .remove ().
Я использовал метод remove (), когда использовал только один итератор, и проблем там не было.
Если исключение вызвано тем, что я удаляю элемент из 'c' или 'hs' во время итерации по нему, то исключение должно быть выдано, когда оно встречается с ближайшим к нему 2 .next ( ), но я этого не вижу. Я вижу это, когда встречается с командой it.next ().
Я использовал отладчик, и коллекции и итераторы находятся в идеальном порядке после удаления элемента. Они содержат и указывают на соответствующий обновленный набор и элемент. it.next () содержит следующий элемент для анализа, это не удаленный элемент.
Есть какие-нибудь идеи относительно того, как я могу делать то, что я пытаюсь сделать, не делая копию самого хэш-набора и используя его в качестве промежуточного звена до того, как я фиксирую обновления?
Спасибо