我从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的功能。我总是得到一些真正有价值的优惠。
答案 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());
}
}