Siguiendo el tip creado por carloz.yanez sobre los arrays multidimensionales, escribí una clase de ActionScript 3 para crear y controlar el array. La clase MultiArray
Veamos primero su uso ![]()
En el documento .fla
Código :
import MultiArray; var array:MultiArray = new MultiArray();
Ahora para llenar de datos el array utilizaremos las funciones pushFila() y pushColumna()
Código :
array.pushFila(["1a","1b","1c"]); array.pushFila(["2a","2b","2c","2d"]); array.pushFila(["3a","3b"]);
Esto nos dará como resultado un array multidimensional asi:
Código :
1a,1b,1c,<> 2a,2b,2c,2d 3a,3b,<>,<>
nota: podemos hacer un trace del array con la función traceArray()
El símbolo "<>" lo hemos añadido para rellenar los espacios vacíos del array. Es decir, el ítem que estaría en la posición "1d" no existía en el array introducido para la primera fila como no puede quedar vacío le introducimos un valor falso. Esto lo controlamos con una función privadacontrolaVacios(). El símbolo lo hemos definido en la variable _vacio y podíamos haber usado cualquier otro string.
Lo mismo pasaría al añadir otra columna. Se rellenaran los espacios vacíos:
Código :
array.pushColumna(["1e","2e","3e","4e","5e"]);
Resultado:
Código :
1a,1b,1c,<>,1e 2a,2b,2c,2d,2e 3a,3b,<>,<>,3e <>,<>,<>,<>,4e <>,<>,<>,<>,5e
Podemos seguir modificando el array sustituyendo un item en concreto:
Código :
array.putItem(2,3,"XX");
Código :
1a,1b,1c,<>,1e 2a,2b,2c,2d,2e 3a,3b,<>,<>,3e <>,<>,XX,<>,4e <>,<>,<>,<>,5e
O sustituyendo filas y columnas enteras:
Código :
array.swapFila(1,["Z1","Z2","Z3","Z4","Z5"]); array.swapColumna(3,["1S","2S","3S","4S","5S"]);
Resultado:
Código :
1a,1b,1c,1S,1e Z1,Z2,Z3,2S,Z5 3a,3b,<>,3S,3e <>,<>,XX,4S,4e <>,<>,<>,5S,5e
A partir de aquí recuperamos los datos con:
Código :
trace(array.getItem(1,2));
Se obtiene el item de la fila 2 columna 3 (tener en cuenta que el primer elemento de un Array es el cero):
Código :
3b
Para obtener una fila entera:
Código :
trace(array.getFila(2));
Se obtiene un array:
Código :
3a,3b,<>,3S,3e
Para obtener una cloumna entera:
Código :
trace(array.getColumna(4));
Se obtiene un array:
Código :
1e,Z5,3e,4e,5e
Este sería el código de la clase MultiArray:":
Código :
package {
//------------------------------
public class MultiArray {
//--------------------------
private var _array:Array;
private var _dx:int;
private var _dy:int;
public var _vacio:String;
//
//--------------------------
public function MultiArray() {
_array = new Array();
_dx = 0;
_dy = 0;
_vacio = "<>";
}
//--------------------------
public function pushFila(fila:Array):void {
_dy = (_dy > 0)?_dy+1 :1;
_dx = (_dx > fila.length)?_dx :fila.length;
_array.push(fila);
controlaVacios();
}
//--------------------------
public function pushColumna(columna:Array):void {
while (_dy < columna.length) {
pushFila([_vacio]);
}
_dx = (_dx > 0)?_dx+1 :1;
for (var i:int = 0; i < _dy; i++) {
_array[i].push(columna[i]);
}
controlaVacios();
}
//--------------------------
public function putItem(ix:int,iy:int,item):void {
_array[iy][ix]=item;
}
//--------------------------
public function swapFila(filaNum:int,fila:Array):void {
_array[filaNum] = fila;
controlaVacios();
}
//--------------------------
public function swapColumna(columnaNum:int,columna:Array):void {
for (var i:int = 0; i < columna.length; i++) {
_array[i][columnaNum] = columna[i];
}
controlaVacios();
}
//--------------------------
public function getArray():Array {
return _array;
}
//--------------------------
public function getItem(ix:int,iy:int):Object {
return _array[iy][ix];
}
//--------------------------
public function getFila(filaNum:int):Array {
return _array[filaNum];
}
//--------------------------
public function getColumna(columnaNum:int):Array {
var array:Array = new Array();
for (var i:int = 0; i < _dy; i++) {
array.push(_array[i][columnaNum]);
}
return array;
}
//--------------------------
public function traceArray():void {
for (var i:int = 0; i < _dy; i++) {
trace(_array[i]);
}
}
//--------------------------
//--------------------------
private function controlaVacios():void {
for (var i:int = 0; i < _dy; i++) {
while (_array[i].length<_dx) {
_array[i].push(_vacio);
}
}
}
//--------------------------
}
}

Por Carlos N el 10 de Julio de 2007
realmente esta muy bueno
Por Lunatic el 10 de Julio de 2007
http://es.wikipedia.org/wiki/Matriz_(matemática)
Y ademas es mas corto
Por Julian el 10 de Julio de 2007
Por Aizen el 10 de Julio de 2007
Si me lo permites, te hago algunas recomendaciones.
Primera
Código :
Eso es exactamente lo mismo que:
Código :
Te explico por que, tu preguntas que si es mayor a cero le sume uno, PERO si no es mayor a cero, es cero, por que en el constructor así lo declaras, entonces 0 + 1 = 1, por eso con poner mas uno es suficiente. Para controlar esto, declara la variable de tipo uint, para que no permita negativos.
Segunda
Código :
Esto es mas legible y hace exactamente lo mismo:
Código :
Tercera
Código :
while (_dy < columna.length) {Esto aun que no lo parezca, mejora notablemente el rendimiento de la clase.
Código :
var columnLength:Number = columna.length; while (_dy < columnLength) {Cuarta
Código :
La constante de vacio mejor declarala así.
Quinta
Código :
public function putItem(ix:int,iy:int,item):void {Item declaralo como Object(una variable de tipo Objecto, admite cualquier objeto, string, numero y clase)
Código :
public function putItem(ix:int,iy:int,item:Object):void {Sexta
Código :
public function putItem(ix:int,iy:int,item):Boolean { if( _array[iy] is Array && _array[iy].length > ix ) { _array[iy][ix]=item; return true; } return false; }Se podría verificar si el elemente existe antes de intentar asignarlo.
Septima
Código :
while (_array[i].length<_dx) {Igual que en la recomendación segunda, no uses la propiedad length dentro de un ciclo.
Octava, los comentarios, serían mas legibles así, y muchos documentadores automáticos usan una sintaxis similar.
Código :
Zguillez, como te digo son recomendaciones NO quiere decir que algo esta mal, ni que les tengas que hacer caso a todas.
saludos
Dano :
Todas las recomendaciones se agradecen. Aqui estamos todos para aprender.
Gracias Dano
Por wil el 29 de Febrero de 2008
Por glo el 21 de Octubre de 2008
Por AJAJAJAJA el 24 de Junio de 2009
Por Elequego el 05 de Mayo de 2010
ironeric23-blog :
el método pushFila es propio de la clase que creó Zguillez