2016-03-12 2 views
8

У меня есть простой список (recyclerView), где у каждого элемента списка есть флажок. Все элементы, которые были проверены, должны быть удалены с помощью этого кода:ArrayList.remove (i) не удаляет все объекты, как это должно быть

for(int i = 0; i<shopListItems.size(); i++) { 
    if(shopListItems.get(i).isBought == 1) { 
     shopListItems.remove(i); 
    } 
} 

Но по какой-то причине он не разбирается. Если проверено 10 элементов, то только 7 из них будут удалены, и я должен снова запустить код, чтобы удалить остальные.

кода кажется нормально, но я действительно не понимаю, почему это Dont удалить все отмеченное или все, что (isBought == 1)

+3

Если вы удалите элемент 0, старый элемент 1 переместится в положение 0, но ваш цикл пропустит его, продолжая в позиции 1. –

ответ

18

remove(index) не только удалить объект, но переложить все остальные объекты влево, чтобы закрыть этот пробел. Вам необходимо выполнить итерацию с конца списка до начала

for(int i = shopListItems.size() - 1 ; i >= 0 ; i--) { 
    if(shopListItems.get(i).isBought == 1){ 
     shopListItems.remove(i); 
    } 
} 
+0

Я попробую это сейчас. Я не знал о смещении объектов! – Muddz

+1

@Muddz https://docs.oracle.com/javase/7/docs/api/java/util/List.html#remove(int) Удаляет элемент в указанной позиции в этом списке (дополнительная операция). Сдвигает любые последующие элементы слева (вычитает один из их индексов). Возвращает элемент, который был удален из списка. – Yoda

+0

@Yoda спасибо за ссылку. Это важно знать! Я об этом не думал. Конечно, когда вы удаляете что-то из списка, будет разрыв, и этот пробел должен быть закрыт. – Muddz

4

Обратный цикл!

 for(int i = shopListItems.size() -1; i >=0 i--){ 
      if(shopListItems.get(i).isBought == 1){ 
       shopListItems.remove(i); 
      } 
     } 

Если вы не собираетесь удалить всю ArrayList, вы не должны беспокоиться, потому что, как изменения размера, это не повлияет на остальную часть испытаний.

5

Помимо способов, упомянутых выше, вы также можете сделать это в порядке возрастания:

for(int i = 0; i < list.size(); i++){ 
    if(list.get(i).isBought == 1){ 
     list.remove(i--); 
    } 
} 

Существует еще один простой альтернативой, если вы используете Java 8:

list = list.stream() 
     .filter(item -> item.isBought == 1) 
     .collect(Collectors.toList()); 

Ссылка: http://zeroturnaround.com/rebellabs/java-8-explained-applying-lambdas-to-java-collections/

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