-1

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

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

                }
        }
  return offers;

当我打印出测试报价时,我得到了正确的结果,每个人都是正确的。但是当我尝试使用真正的布尔值删除元素时,我得到了错误的结果。它打印出带有假布尔值的报价。我不知道问题出在哪里?感谢帮助

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

4

1 回答 1

7

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

拆除前:

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());
    }
}
于 2013-01-18T15:15:34.693 回答