Iteracja po tablicy i usuwanie wartości

Posted In: Bez kategorii

W wielu językach programowania iteracja po tablicach odbywa się mniej więcej tak:

for (foo in arr) {
...
}

Dzięki takiej iteracji po wszystkich elementach, możemy łatwo przeczyścić całą tablicę podczas, na przykład, czyszczenia pamięci z obiektów.

var arr:Array= [];
for (i in 0...100) {
   arr.push(1);
}
for (foo in arr) {
   foo.somePreDisposeFunction();
   arr.remove(foo);
   foo = null;
}
trace(arr.length);

Po uruchomieniu takiego kodu okaże się, że tablica nadal zawiera w sobie obiekty, dokładnie połowę poprzedniej ilości. WAT.

Otóż funkcja remove() wykonana w trakcie pętli usunie obiekt na obecnej pozycji, przesunie tablicę w lewo, a pętla for przesunie obecną pozycję w prawo, tak więc jeden obiekt zostanie pominięty. Dlatego też używaj poniższego:

var arr:Array= [];
for (i in 0...100) {
   arr.push(1);
}
while (arr.length > 0) {
   var foo = arr.pop();
   foo.somePreDisposeFunction();
   foo = null;
}
trace(arr.length);

W ten sposób iteracja i usuwanie (funkcja pop()) wykonywana jest od końca tablicy i nie zagraża w żaden sposób całej pętli.