ArrayList.remove(i)不会删除所有对象

8 java list

我有一个简单的listview(recyclerView),其中每个list-item都有一个复选框.应使用以下代码删除所有选中的项目:

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

但由于某种原因,它没有.如果选中了10个项目,则只会删除其中的7个项目,我必须再次运行该代码以删除其余项目.

代码似乎很好,但我真的不明白为什么它不会删除所有已检查的或所有的(isBought == 1).

Guy*_*Guy 18

remove(index)不仅会删除对象,还会移动所有剩余的对象以缩小间隙.您需要从列表末尾迭代到开始

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

  • 首先迭代列表时不应该删除项目 - 使用带有`Iterator #remove()`的`Iterator`. (3认同)

SOF*_*OFe 5

除了上面提到的方法,您还可以按升序执行:

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

如果您使用的是Java 8,还有另一种简单的替代方法:

list = list.stream()
        .filter(item -> item.isBought == 1)
        .collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)

参考:http://zeroturnaround.com/rebellabs/java-8-explained-applying-lambdas-to-java-collections/