反復処理中に配列 (または反復可能なリスト) から要素を削除する場合は注意が必要です。
私の経験では、最も簡単な方法は、新しいリストを作成することです。そうすることを検討できますか?
コードを見て、まず比較のために「==」よりも「equals」を使用することを忘れないでください(.equals は「意味的に同等」を意味するため、ここで必要なものだと思います)。(編集:オートボクシングのためにここでは問題にならないかもしれませんが、それでも良い習慣です)
しかし、これでもうまくいきません:
for (int i = 1; i < arraylist.size(); i++) {
if (arraylist.get(i).equals(v1))
arraylist.remove(i);
}
3 つの整数の ArrayList があると想像してみてください。すべて同じです。i == 1 の場合、インデックス 1 の要素がインデックス 0 の値と比較され、削除されます。しかし、その後、インデックス 2 の要素がインデックス 1 の要素になり、for ループ カウンターがインクリメントされるため、リストの最後のエントリを削除するには「欠落」します。
このようなものをお勧めできますか?
List<Integer> newlist = new ArrayList<Integer>();
newlist.add(v1);
for (Integer integer : arraylist) {
if (!integer.equals(v1))
newlist.add(integer);
}
頑張ってください!
PS 勇気がある場合は、次のような簡単な方法を実行できるかもしれません:
CollectionUtils.filter(Collection,Predicate)
CollectionUtils.filter(arraylist.subList(1, arraylist.size()), new Predicate() {
@Override
public boolean evaluate(Object o) {
return !v1.equals(o);
}
});