Documentación de Flash CS3 |
|||
| Programación con ActionScript 3.0 > Utilización de matrices > Matrices asociativas | |||
Las matrices asociativas, a veces denominadas hashes o asignaciones, utilizan claves en lugar de un índice numérico para organizar los valores almacenados. Cada clave de una matriz asociativa es una cadena única que se utiliza para acceder a un valor almacenado. Una matriz asociativa es una instancia de la clase Object, lo que significa que cada clave corresponde a un nombre de propiedad. Las matrices asociativas son conjuntos no ordenados de pares formados por una clave y un valor. Hay que tener en cuenta en el código que las claves de una matriz asociativa no tienen un orden específico.
ActionScript 3.0 introduce un tipo avanzado de matriz asociativa denominado diccionario. Los diccionarios, que son instancias de la clase Dictionary del paquete flash.utils, utilizan claves que pueden ser de cualquier tipo de datos, pero que normalmente son instancias de la clase Object. Es decir, las claves de diccionario no están limitadas a valores de tipo String.
En esta sección se describe la manera de crear matrices asociativas que utilizan cadenas como claves y la forma de utilizar la clase Dictionary.
Hay dos formas de crear matrices asociativas en ActionScript 3.0. La primera manera consiste en utilizar el constructor de Object, que ofrece la ventaja de permitir inicializar la matriz con un objeto literal. Una instancia de la clase Object, conocida también como objeto genérico, es funcionalmente idéntica a una matriz asociativa. El nombre de cada propiedad del objeto genérico actúa a modo de clave que permite acceder a un valor almacenado.
Este código crea una matriz asociativa denominada monitorInfo y utiliza un literal de objeto para inicializar la matriz con dos pares clave/valor.
var monitorInfo:Object = {type:"Flat Panel", resolution:"1600 x 1200"};
trace(monitorInfo["type"], monitorInfo["resolution"]);
// salida: Flat Panel 1600 x 1200
Si no es necesario inicializar la matriz en el momento de declararla, se puede utilizar el constructor Object para crear la matriz de la manera siguiente:
var monitorInfo:Object = new Object();
Una vez creada una matriz con un literal de objeto o el constructor de la clase Object, se pueden añadir valores nuevos a la matriz mediante el operador de corchetes ([]) o el operador punto (.). En el ejemplo siguiente se añaden dos valores nuevos a monitorArray:
monitorInfo["aspect ratio"] = "16:10"; // forma incorrecta, no utilizar espacios monitorInfo.colors = "16.7 million"; trace(monitorInfo["aspect ratio"], monitorInfo.colors); // salida: 16:10 16.7 million
Hay que tener en cuenta que la clave denominada aspect ratio contiene un espacio en blanco. Esto es posible con el operador de corchetes, pero genera un error si se intenta con el operador punto. No es recomendable utilizar espacios en los nombres de claves.
La segunda forma de crear una matriz asociativa consiste en utilizar el constructor de Array y utilizar después el operador de corchetes ([]) o el operador punto (.) para añadir pares clave-valor a la matriz. Si se declara la matriz asociativa con el tipo Array, no se podrá utilizar un literal de objeto para inicializar la matriz. En el ejemplo siguiente se crea una matriz asociativa denominada monitorInfo empleando el constructor de Array y se añaden claves denominadas type y resolution, junto con sus valores:
var monitorInfo:Array = new Array(); monitorInfo["type"] = "Flat Panel"; monitorInfo["resolution"] = "1600 x 1200"; trace(monitorInfo["type"], monitorInfo["resolution"]); // salida: Flat Panel 1600 x 1200
La utilización del constructor de Array para crear una matriz asociativa no aporta ninguna ventaja. No se puede utilizar la propiedad Array.length ni ninguno de los métodos de la clase Array con las matrices asociativas, incluso si se utiliza el constructor de Array o el tipo de datos Array. Es mejor dejar el uso del constructor de Array para la creación de matrices indexadas.
Se puede utilizar la clase Dictionary para crear una matriz asociativa que utilice objetos como claves en lugar de cadenas. Estas matrices se llaman a veces diccionarios, hashes o asignaciones. Por ejemplo, considérese una aplicación que determina la ubicación de un objeto Sprite a partir de su asociación con un contenedor específico. Se puede utilizar un objeto Dictionary para asignar cada objeto Sprite a un contenedor.
El código siguiente crea tres instancias de la clase Sprite que serán las claves del objeto Dictionary. A cada clave se le asigna un valor GroupA o GroupB. Los valores pueden ser de cualquier tipo de datos, pero en este ejemplo GroupA yGroupB son instancias de la clase Object. Posteriormente se podrá acceder al valor asociado con cada clave mediante el operador de acceso a una propiedad ([]), como se indica en el código siguiente:
import flash.display.Sprite;
import flash.utils.Dictionary;
var groupMap:Dictionary = new Dictionary();
// objetos que se van a utilizar como claves
var spr1:Sprite = new Sprite();
var spr2:Sprite = new Sprite();
var spr3:Sprite = new Sprite();
// objetos que se van a utilizar como valores
var groupA:Object = new Object();
var groupB:Object = new Object();
// Crear nuevos pares clave-valor en el diccionario.
groupMap[spr1] = groupA;
groupMap[spr2] = groupB;
groupMap[spr3] = groupB;
if (groupMap[spr1] == groupA)
{
trace("spr1 is in groupA");
}
if (groupMap[spr2] == groupB)
{
trace("spr2 is in groupB");
}
if (groupMap[spr3] == groupB)
{
trace("spr3 is in groupB");
}
Se puede recorrer el contenido de un objeto Dictionary con un bucle for..in o un bucle for each..in. Un bucle for..in permite recorrer las claves, mientras que un bucle for each..in permite recorrer los valores asociados con cada clave.
El bucle for..in se utiliza para dirigir el acceso a las claves de tipo Object de un objeto Dictionary. También se puede acceder a los valores del objeto Dictionary con el operador de acceso a una propiedad ([]). El código siguiente utiliza el ejemplo anterior del diccionario groupMap para mostrar la manera de recorrer un objeto Dictionary con el bucle for..in:
for (var key:Object in groupMap)
{
trace(key, groupMap[key]);
}
/* salida:
[object Sprite] [object Object]
[object Sprite] [object Object]
[object Sprite] [object Object]
*/
El bucle for each..in se utiliza para dirigir el acceso a los valores de un objeto Dictionary. El código siguiente también utiliza el diccionario groupMap para mostrar la manera de recorrer un objeto Dictionary con el bucle for each..in:
for each (var item:Object in groupMap){trace(item);}/* salida: [object Object] [object Object] [object Object] */
Adobe Flash Player utiliza un sistema de eliminación de datos innecesarios para recuperar la memoria que ya no se está utilizando. Cuando ya no quedan referencias a un objeto, el objeto se convierte en disponible para la eliminación de datos innecesarios y se recupera la memoria la próxima vez que se ejecute el sistema de eliminación de datos innecesarios. Por ejemplo, el código siguiente crea un nuevo objeto y asigna una referencia al objeto a la variable myObject:
var myObject:Object = new Object();
Con que exista una referencia al objeto, el sistema de eliminación de datos innecesarios no recuperará la memoria ocupada por el objeto. Si se cambia el valor de myObject de forma que haga referencia a un objeto distinto o se establece en el valor null, la memoria ocupada por el objeto original se convierte en disponible para la eliminación de datos innecesarios, pero sólo si no hay otras referencias al objeto original.
Si se utiliza myObject como clave de un objeto Dictionary, se crea otra referencia al objeto original. Por ejemplo, el código siguiente crea dos referencias a un objeto: la variable myObject y la clave del objeto myMap:
import flash.utils.Dictionary; var myObject:Object = new Object(); var myMap:Dictionary = new Dictionary(); myMap[myObject] = "foo";
Para hacer que el objeto al que hace referencia myObject esté disponible para la eliminación de datos innecesarios, hay que eliminar todas las referencias a dicho objeto. En este caso, hay que cambiar el valor de myObject y eliminar la clave myObject de myMap, como se indica en el código siguiente:
myObject = null; delete myMap[myObject];
Como alternativa, se puede utilizar el parámetro useWeakReference del constructor de Dictionary para convertir todas las claves del diccionario en referencias débiles. El sistema de eliminación de datos innecesarios no tiene en cuenta las referencias débiles, lo que significa que un objeto que sólo tenga referencias débiles estará disponible para la eliminación de datos innecesarios. Por ejemplo, en el código siguiente no es necesario eliminar la clave myObject de myMap para hacer que el objeto esté disponible para la eliminación de datos innecesarios:
import flash.utils.Dictionary; var myObject:Object = new Object(); var myMap:Dictionary = new Dictionary(true); myMap[myObject] = "foo"; myObject = null; // Hacer que el objeto esté disponible para la eliminación de datos innecesarios.
Flash CS3
Enviarme un mensaje de correo electrónico cuando se añadan comentarios a esta página | Informe de comentarios
Página actual: http://livedocs.adobe.com/flash/9.0_es/main/00000090.html