Forループを使用してArrayListからデータを削除する 質問する

Forループを使用してArrayListからデータを削除する 質問する

奇妙な問題が発生しました。数分かかるだろうと思っていましたが、今では数時間も苦労しています... 結果は次の通りです:

for (int i = 0; i < size; i++){
    if (data.get(i).getCaption().contains("_Hardi")){
        data.remove(i);
    }
}

ArrayList にはいくつかの文字列 (合計 14 個程度)dataArrayList.あり、そのうち 9 つに _Hardi という名前が含まれています。

そして、上記のコードでそれらを削除したいと思います。replace data.remove(i);を使用するSystem.out.printlnと、何かが 9 回出力されますが、_Hardi は ArrayList に 9 回含まれているので、これで問題ありません。

しかし、それを使用するとdata.remove(i);、9 つすべてが削除されるわけではなく、いくつかだけが削除されます。いくつかテストを行ったところ、次のことも確認されました。

文字列の名前を次のように変更します: Hardi1 Hardi2 Hardi3 Hardi4 Hardi5 Hardi6

次に、偶数 (1、3、5 など) だけを削除します。彼は常に 1 をスキップしていますが、その理由がわかりません。

これを修正するにはどうすればいいでしょうか? あるいは、削除する別の方法があるでしょうか?

ベストアンサー1

ここでの問題は、繰り返していることだ0からサイズまで、ループ内ではアイテムを削除しますアイテムを削除するとリストのサイズが小さくなりますが、有効サイズ (削除されたアイテム後のサイズ) を超えるインデックスにアクセスしようとすると失敗します。

これを行うには 2 つの方法があります。

消去イテレータの使用インデックスを処理したくない場合。

for (Iterator<Object> it = data.iterator(); it.hasNext();) {
if (it.next().getCaption().contains("_Hardi")) {
    it.remove();
}
}

それ以外、最後から削除します。

for (int i = size-1; i >= 0; i--){
    if (data.get(i).getCaption().contains("_Hardi")){
            data.remove(i);
    }
 }

おすすめ記事