util.list没有删除所有元素

时间:2013-01-18 15:13:25

标签: java list

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

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

                }
        }
  return offers;

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

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

1 个答案:

答案 0 :(得分:7)

如果您在之前添加remove(当前已注释掉),则使用System.out.println调用,那么您将打印出不同的< / em>您删除的值的值。例如:

删除前:

0 - Foo
1 - Bar
2 - Baz

如果i是一个,我们会调用remove(1),留下

0 - Foo
1 - Baz

...所以我们删除了 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());
    }
}

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

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());
    }
}