util.list没有删除所有元素

Mit*_*ogl -1 java list

我从List中删除元素时遇到了非常不寻常的问题.这是我的代码:

for (int i = 0; i < offers.size(); i++) {
                if(offers.get(i).isSpecialOffer()){
                    offers.remove(i);

                }
        }
  return offers;
Run Code Online (Sandbox Code Playgroud)

当我打印出测试要约时,我得到了正确的结果,每个人都是真的.但是当我尝试使用true boolean删除元素时,我得到了错误的结果.它使用false boolean打印出商品.我不知道问题出在哪里?感谢帮助

更新:我有从List中删除specialOffers的功能.我总是得到一些真正有价值的优惠.

Jon*_*eet 7

如果您使用呼叫之前包含remove(当前已注释掉),那么您将打印出与您删除的值不同的值.例如:System.out.println

删除前:

0 - Foo
1 - Bar
2 - Baz
Run Code Online (Sandbox Code Playgroud)

如果i是一个,我们会打电话remove(1),离开

0 - Foo
1 - Baz
Run Code Online (Sandbox Code Playgroud)

...所以我们删除了 Bar,然后我们打印 Baz

然后你也不会检查Baz,因为i在再次测试之前你会增加到2.

要正确地执行此类操作,您应该使用如下循环:

for (Iterator<Offer> iterator = offers.iterator(); iterator.hasNext() ;) {
    Offer offer = iterator.next();
    if (offer.isSpecialOffer()) {
        iterator.remove(); // Must remove using the iterator!
        System.out.println(offer.isSpecialOffer() + ".." + offer.getName());
    }
}
Run Code Online (Sandbox Code Playgroud)

或者,如果您真的想要使用索引,理想情况下可以向后工作以避免出现问题:

for (int i = offers.size() - 1; i >= 0; i--) {
    Offer offer = offers.get(i);
    if (offer.isSpecialOffer()) {
        offers.remove(i);
        // Use offer, not offers.get(i)
        System.out.println(offer.isSpecialOffer() + ".." + offer.getName());
    }
}
Run Code Online (Sandbox Code Playgroud)