Удалите элементы из Arraylist, если они присутствуют в другом, не вызывая ConcurrentModificationException - PullRequest
2 голосов
/ 21 декабря 2011

Вот код:

Ledger obj = null;
MyUtilPojo obj1 = null;
Iterator it = toList.iterator();
while (it.hasNext()) {
    obj = (Ledger) it.next(); //after first iteration next here produce an error
    Iterator it1 = moreToList.iterator();
    while (it1.hasNext()) {
        obj1 = (MyUtilPojo) it1.next();
        if (obj.getId() == obj1.getKey()) {
            toList.remove(obj);                                
        }
    }
}

Это вызывает ошибку ConcurrentModificationException, кто-то может помочь?

Ответы [ 2 ]

0 голосов
/ 21 декабря 2011

ConcurrentModificationException возникает при изменении списка (добавлением или удалением элементов) при обходе списка с помощью Iterator.

    Ledger obj = null;
    MyUtilPojo obj1 = null;
    List thingsToBeDeleted = new ArrayList();

    Iterator it = toList.iterator();
    while (it.hasNext()) {
        obj = (Ledger) it.next();
        Iterator it1 = moreToList.iterator();
        while (it1.hasNext()) {
            obj1 = (MyUtilPojo) it1.next();
            if (obj.getId() == obj1.getKey()) {
                thingsToBeDeleted.add(obj);    // put things to be deleted                            
            }
        }
    }
    toList.removeAll(thingsToBeDeleted);
0 голосов
/ 21 декабря 2011

Нечто подобное должно работать (создает новый контент для toList во временном списке):

final List<Ledger> target = new ArrayList<Ledger>();
for (final Ledger led : toList) {
    for (final MyUtilPojo mup : moreToList) {
        if (led.getId() != mup.getKey()) { // beware of !=
            target.add(led);
        }
    }
}

toList = target;
...