Hace días preguntaron como hacer Matrices o Arreglos Multidimensionales en Actionscript 3. Me tome la tarea de hacer una clase que facilite este proceso pero con Vectores para aprovechar la rapidez de este objeto. Es mucho mejor usar Vector que Array en Actionscript 3.
Clase VectorUtils para manipulación de matrices y vectores en Actionscript 3
Código :
package com.renzocastro.utils { import flash.system.ApplicationDomain; import flash.utils.getQualifiedClassName; public class VectorUtils { static private const VECTOR_OPEN:String = 'Vector.<'; static private const VECTOR_CLOSE:String = '>'; static public var applicationDomain:ApplicationDomain; static public function matrix(type:Class, ...args):* { var res:*; var total:int = args.length; if ( total == 0 ) { res = new type; } else { var className:String = getQualifiedClassName(type); for (var i:int = 0; i < total; i++) className = VECTOR_OPEN + className + VECTOR_CLOSE; //endfor if ( applicationDomain == null ) applicationDomain = ApplicationDomain.currentDomain; var ClassVector:Class = Class(applicationDomain.getDefinition(className)); res = _matrix(new ClassVector(int(args[0]), true), className, args); } return res; } static private function _matrix(instance:*, className:String, params:Array, index:int=0):* { className = className.replace( new RegExp(VECTOR_OPEN + '(.*)' + VECTOR_CLOSE), '$1'); if ( className.indexOf(VECTOR_OPEN) > -1 ) { var ClassVector:Class = Class(applicationDomain.getDefinition(className)); var total:int = instance.length; for (var i:int = 0; i < total; i++) instance[i] = _matrix(new ClassVector(int(params[index+1]), true), className, params, index + 1); //endfor } return instance; } static public function isVector(value:*):Boolean { return getQualifiedClassName(value).indexOf('Vector.<') > -1; } } }
Su uso:
Código :
var vec1:* = VectorUtils.matrix(int, 2); trace( vec1[1] ); var vec2:* = VectorUtils.matrix(Number, 2, 3); trace( vec2[1][2] ); var vec3:* = VectorUtils.matrix(String, 2, 3, 4); vec3[1][2][3] = 'This is Cristalab!'; trace( vec3[1][2][3] ); // Usando una clase de otro dominio VectorUtils.applicationDomain = loader.contentLoaderInfo.applicationDomain; var NewClass:Class = VectorUtils.applicationDomain.getDefinition("ClaseDeOtroSWF") as Class; var vec3:* = VectorUtils.matrix(NewClass, 10, 10); vec3[9][5] = new NewClass(); // Bonus: Es Vector? trace( VectorUtils.isVector(vec3) );
Espero les sirva

¿Sabes SQL? ¿No-SQL? Aprende MySQL, PostgreSQL, MongoDB, Redis y más con el Curso Profesional de Bases de Datos que empieza el martes, en vivo.
emedina :
Las dimensiones de la matriz la asignas después del primer parámetro con valores enteros y seguida de comas según las dimensiones que quieras.
VectorUtils.matrix(int, 2); Esto sería una dimensión con 2 valores (Total de Items: 2).
VectorUtils.matrix(int, 2x2); Esto sería 2 dimensiones con 2 valores cada una (Total de Items: 4).
VectorUtils.matrix(int, 2x3); Esto sería 2 dimensiones con 3 valores cada una (Total de Items: 6).
Y así va creciendo.
VectorUtils.matrix(int, 2); Esto sería una dimensión con 2 valores (Total de Items: 2).
VectorUtils.matrix(int, 2, 2); Esto sería 2 dimensiones con 2 valores cada una (Total de Items: 4).
VectorUtils.matrix(int, 2, 3); Esto sería 2 dimensiones con 3 valores cada una (Total de Items: 6).
Aunque hay algo que me "complica", en esta clase... Generalmente cuando uso Arrays Bidimensionales, los hago para por ejemplo, almacenar Nombre de Algo, Valor Int de Algo (Por decir un ejemplo). Pero sino entiendo mal (Confieso leí rápido la clase), esto me permite manejar dos dimensiones haciendo:
Código :
¿Como creo una Matriz de 2 dimensiones con tipos de datos mezclados?
Saludos, Hernán . -
Hernán :
Aunque hay algo que me "complica", en esta clase... Generalmente cuando uso Arrays Bidimensionales, los hago para por ejemplo, almacenar Nombre de Algo, Valor Int de Algo (Por decir un ejemplo). Pero sino entiendo mal (Confieso leí rápido la clase), esto me permite manejar dos dimensiones haciendo:
Código :
¿Como creo una Matriz de 2 dimensiones con tipos de datos mezclados?
Saludos, Hernán . -
No podrías usar directamente tipos de datos mezclados. Seguí la lógica del ejemplo en C#.
Código :
Se puede notar que se crea una matriz de un sólo tipo de dato y para eso hice esta clase, para manejar un sólo tipo de dato en una matriz. Esto debería tener más sentido trabajando un juego que para manejar datos simples.Pero si aun quisieras usar una matriz para el ejemplo que propones lo mejor sería crear una clase del tipo ValueObject.
Código :
Código :
Ahora una pregunta más... ¿Hereda los métodos y propiedades de los Vectores?
Ejemplo:
Código :
Saludos, Hernán . -
Código :
Solo debemos tener claro desde donde empieza cada Vector. Usando el ejemplo anterior sería:Código :
Código :
Gracias por las respuestas. Excelente aporte en mi opinión.
Saludos, Hernán . -
Por AndyX191187 el 26 de Enero de 2011
De todas maneras, como dije, es MUY buen aporte.
Felicitaciones.
Un saludo.