Cristalab

Clase de Actionscript 3 para arrays multidimensionales

   Foros de discusión -> Tips, ¡Envía tus trucos aquí!
Mensaje Autor
Mensaje Publicado: Mar Jul 10, 2007 1:30 am     Citar   firefox 
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 miau

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);
            }
         }
      }
      //--------------------------
   }
}
 _________________

MY : Blog | Facebook | Twitter | Pownce | Jaiku | Plurk | Last.fm | Flickr.

Zguillez
BOFH

Bastard Operators From Hell Héroes Premio_Secretos
clabLevel: 4113
BCN
3 Tutoriales
40 Tips
1 Ejemplos

MP Email Web     Google Talk  MSN Messenger  
Volver arriba
Mensaje Publicado: Mar Jul 10, 2007 2:40 am     Citar   msie 
Que interesante miau para los no iniciados, como yo está perfecto, mas claro que el petroleo... chvre

Carlos N_blog
Invitado






        
Volver arriba
Mensaje Publicado: Mar Jul 10, 2007 2:46 am     Citar   firefox 
como siempre mi estimado Zguillez Sonrisa buen aporte Sonrisa

realmente esta muy bueno Sonrisa
 _________________
U_U SWAT U_U

eldervaz
SWAT Team

Héroes Premio_Secretos SWAT
clabLevel: 3258 Genero:Masculino
Lima - Perú
11 Tutoriales
7 Tips

MP Web     Google Talk  MSN Messenger  
Volver arriba
Mensaje Publicado: Mar Jul 10, 2007 3:54 am     Citar   firefox 
Con esto queda aun más claro para los que no comprendían los array multidimensionales.
 _________________

Carloz.Yanez
SWAT Team

Héroes SWAT
clabLevel: 2374
Entrance to Hell
3 Tutoriales
31 Tips

MP Email         
Volver arriba
Mensaje Publicado: Mar Jul 10, 2007 5:28 am     Citar   firefox 
Creo que el titulo del tip deberia ser "Clase de Actionscript 3 para Matrices"... por lo siguiente:
http://es.wikipedia.org/wiki/Matriz_(matemática)

Y ademas es mas corto Lengua

Guiño

Lunatic_blog
Invitado






        
Volver arriba
Mensaje Publicado: Mar Jul 10, 2007 10:37 am     Citar   msie 
Muy buen tip. Por cierto eldervaz (se que este no es el lugar, pero no me queda otra) como haces ese logotipo en 3d giratorio que hay en tu blog. Esta muy bueno.

Julian_blog
Invitado






        
Volver arriba
Mensaje Publicado: Mar Jul 10, 2007 2:14 pm     Citar   firefox 
swiftd3d ?

Aizen_blog
Invitado






        
Volver arriba
Mensaje Publicado: Mar Jul 10, 2007 2:29 pm     Citar   firefox 
Zguillez, muy buena tu clase, felicidades.

Si me lo permites, te hago algunas recomendaciones.

Primera

Código :

 _dy = (_dy > 0)?_dy+1 :1; 

Eso es exactamente lo mismo que:

Código :

_dy += 1;

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. Guiño

Segunda

Código :

_dx = (_dx > fila.length)?_dx :fila.length;

Esto es mas legible y hace exactamente lo mismo:

Código :

if(_dx <= fila.length)
  _dx = fila.length;


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 :

public const _vacio:String = "<>";

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 :


     /**
     ********************
     * Method: getArray
     * Description:
     ********************
     **/


Zguillez, como te digo son recomendaciones NO quiere decir que algo esta mal, ni que les tengas que hacer caso a todas.


saludos miau
 _________________
Hemisferio derecho

Blog de la selección mexicana.

Dano
BOFH

Bastard Operators From Hell
clabLevel: 2902 Genero:Masculino

3 Tutoriales
7 Tips
10 Ejemplos

MP Web         
Volver arriba
Mensaje Publicado: Mar Jul 10, 2007 3:08 pm     Citar   firefox 

Dano escribió:

Zguillez, como te digo son recomendaciones NO quiere decir que algo esta mal, ni que les tengas que hacer caso a todas.

Todas las recomendaciones se agradecen. Aqui estamos todos para aprender.
Gracias Dano Guiño
 _________________

MY : Blog | Facebook | Twitter | Pownce | Jaiku | Plurk | Last.fm | Flickr.

Zguillez
BOFH

Bastard Operators From Hell Héroes Premio_Secretos
clabLevel: 4113
BCN
3 Tutoriales
40 Tips
1 Ejemplos

MP Email Web     Google Talk  MSN Messenger  
Volver arriba
Mensaje Publicado: Vie Feb 29, 2008 11:01 pm     Citar   firefox 
wow re wow !

wil_blog
Invitado






        
Volver arriba
Responder al tema    Foros de discusión -> Tips, ¡Envía tus trucos aquí! Todas las horas son GMT
Página 1 de 1

Respuesta Rapida
Nick: 

  Citar el ultimo mensaje
Adjuntar tu firma

Mostrar mensajes de anteriores:
  

 


Cristalab BloodBerry Style © 2006 Cristalab
Powered by phpBB © 2001, 2002 phpBB Group