2

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

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

谢谢

4

3 回答 3

5

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

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

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

    i.remove();
}

这种方法也可能更快,因为 usingiterator.remove()避免了在列表中搜索所需的项目list.remove(item)

于 2012-02-19T19:45:09.637 回答
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指的是支持删除操作的类型。

于 2012-02-19T19:43:38.673 回答
-1

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

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

于 2012-02-19T19:48:27.430 回答