我从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的功能.我总是得到一些真正有价值的优惠.
如果您在使用呼叫之前包含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)
| 归档时间: |
|
| 查看次数: |
112 次 |
| 最近记录: |