配列オブジェクトの動的削除

シーケンシャルオブジェクトから指定の値を削除する際のバグ例を書いてみます。
プログラミング慣れした人は簡単に気が付くと思いますが意外に多いバグだと思います。

下記は配列の中から"a2"という値をすべて削除するjavascriptの例です。

var a = new Array("a1","a2","a3","a4");
for (i=0; i<a.length; i++) {
	if (a[i]=="a2") {
		a.splice(i,1); //i番目を削除
	}
}

結果aは {"a1","a3","a4"} となり問題なく見えますが、
削除されるタイミングの問題で実際には"a3"が評価されていません。

var a = new Array("a1","a2","a2","a4");

上記のArrayとした場合、aは {"a1","a2","a4"} となります。
Javaにおいては最近はIteratorを使うのであまり見かけせんが、List#get(int)、List#remove(int)を使用すると発生します。