-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

が1つである場合は、iを呼び出します。remove(1)

0 - Foo
1 - Baz

...削除 Barしたので、印刷します Baz

また、再度テストする前に2にBazインクリメントするため、チェックしません。i

この種のことを適切に行うには、次のようなループを使用する必要があります。

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 に答える