2012-05-02 4 views
1

Скажите, что вы хотите фильтровать элементы из списка. Выполнение этого кода вызывает что-то вроде исключения параллелизма в виде списка модифицируется во время цикла:Фильтрация элементов из списка

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

// Add instances to list here ... 

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

Что такое обычный способ сделать это, и какие другие подходы вы знаете?

+3

возможно дубликат [Вызов удаления в цикле Еогеасп в Java] (http://stackoverflow.com/questions/1196586/calling-remove-in- foreach-loop-in-java) – assylias

ответ

3

лучший способ заключается в использовании Iterator.remove()

+1

@assylias разместил ссылку выше с дополнительной информацией. –

1

В вашем случае, вы можете просто использовать решение без каких-либо итерации вручную сделано (RemoveAll заботится об этом):

aList.removeAll("apple"); 

Снимает все «яблочные» элементы из списка.

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)

Смежные вопросы