Mucha gente tiene problemas a la hora de eliminar elementos de un array, y más si el mismo se está recorriendo frame a frame.

Uno de los problemas más grandes que veo es de lógica. Muchos tienen una lógica para eliminarlos más o menos así:

En JavaScript/ActionScript:

for(var i:int=0; i<myArray.length; i++)
{
   if(myArray[i] == algoQueHagaQueSeElimine)
   {
      myArray.splice(i, 1);
   }
}

 

En C#:

for(int i=0; i<myArray.length; i++)
{
   if(myArray[i] == algoQueHagaQueSeElimine)
   {
      myArray.RemoveAt(i);
   }
}

 

El problema está en que si en el medio de un for eliminamos un índice, nos vamos a quedar con un elemento SIN COMPROBAR. Esto pasa porque al eliminar un elemento, todo el array se acomoda nuevamente. El hueco que falta se rellena con el elemento siguiente, o sea que todos los elementos restantes “retroceden” una casilla. Veamos un ejemplo y la solución:

Hay que tener en cuenta que al momento de eliminar elementos dentro de un bucle, si le estamos diciéndo a dicho bucle que vaya hasta la cantidad máxima de elementos dentro del array, a medida que vayamos eliminándolos este valor se irá haciendo más pequeño. Los mismo pasa si agregamos elementos, pudiendo provocar así un bucle infinito.

Por esto y por algunos temas de performance, es conveniente hacer un bucle al revés. El tema de la performance lo voy a subir en algún momento a un post sobre mitos y verdades. En algunos lenguajes, realmente no hay impacto si el bucle es al revés o no. Pero en otros se nota bastante la diferencia. Más que nada porque se comprueba que el bucle llegue al final con un número, en lugar de con una variable, y en algunos lenguajes lo que consume de más es el modo en el cual el mismo lenguaje opta para saber el valor de una posición de memoria.

Saludos!