并发修改异常java,我不认为我可以在这里使用iterator?

时间:2012-02-19 19:40:46

标签: java exception concurrentmodification

我有一个列表,我需要迭代并删除某些项目。我不能使用迭代器,因为我需要调用每个项目的方法(例如ls.getStatus()),这些方法不适用于迭代器。如果ls.getStatus() == 0我需要删除该项目。如何避免ConcurrentModificationException

for (MyList ls : list) {
    if (ls.getStatus() == 0) {
        ls.run();
        list.remove();
    } else {
        ls.create();
    }
}

由于

3 个答案:

答案 0 :(得分:5)

为什么你认为你不能使用迭代器?

Iterator<MyList> i = list.iterator();
while (i.hasNext()) {
    MyList ls = i.next();

    //... all your other code which uses ls...

    i.remove();
}

此方法也可能更快,因为使用iterator.remove()可以避免必须在列表中搜索list.remove(item)所需的项目。

答案 1 :(得分:1)

您可以使用迭代器,但只能放弃增强的for循环:

for (Iterator<MyList> iterator = list.iterator(); iterator.hasNext(); ) {
    MyList ls = iterator.next();
    if (ls.getStatus() == 0) {
        lo.run(zo);
        iterator.remove();
    } else {
        ls.create();
    }
}

当然,假设list指的是支持删除操作的类型。

答案 2 :(得分:-1)

如果您的迭代器不支持删除操作,您可以使用以下算法:

在第一步中,您可以迭代列表创建要删除的元素索引列表。下一步是向后迭代索引列表并按索引删除元素。