1

假设您要从列表中过滤元素。运行此代码会触发类似并发异常的情况,因为在循环期间正在修改列表:

List<String> aList = new ArrayList<String>();

// Add instances to list here ...

for( String s : aList ){
    if( "apple".equals( s ) ){ // Criteria
        aList.remove(s);
    }
}

执行此操作的常规方法是什么,您还知道哪些其他方法?

4

3 回答 3

3

最好的方法是使用 iterator.remove()

于 2012-05-02T18:22:13.850 回答
1

对于您的情况,您可以简单地使用解决方案而无需手动完成任何迭代(removeAll 会处理此问题):

aList.removeAll("apple");

它从列表中删除所有“苹果”元素。

于 2012-05-02T18:27:29.107 回答
1

如果您正在迭代或拥有一组简单元素,请同意上述两个。如果您的条件或对象涉及更多,请考虑 Apache Commons CollectionUtils 的过滤器方法,它允许您定义一个封装您的条件的谓词,然后将其应用于集合的每个元素。给定您的集合 aList 和谓词 applePredicate,调用方法将是:

org.apache.commons.collections.CollectionUtils.filter(aList, applePredicate);

http://commons.apache.org/collections/apidocs/org/apache/commons/collections/CollectionUtils.html#filter(java.util.Collection , org.apache.commons.collections.Predicate)

于 2012-05-02T18:29:42.913 回答