Escribe tu búsqueda

Colecciones con Xojo: Collection y Dictionary

Compartir

En la pasada entrega comenzamos a ver el primer tipo de datos proporcionado por Xojo para que podamos trabajar con colecciones de datos. Se trataba de los Array y que, básicamente, nos permiten mantener listas ordenadas. De hecho, este es el tipo que utilizarás cuando en tus aplicaciones precises crear tus propias pilas, y colas.

Sin embargo el Array no siempre resulta la opción más ventajosa según el tipo de operaciones que queramos realizar, o bien el modo en el que deseemos acceder posteriormente al conjunto de datos almacenados. El ejemplo más claro es que un Array obliga a que todos los datos almacenados sean del mismo tipo (¡existe un modo de evitar esta limitación, la respuesta se encuentra en el uso de Variant en la declaración del tipo para el Array!).

Collection, accede por índice o por clave

Y precisamente el primero de los tipos de datos que otorga una mayor flexibilidad no es otro que Collection. De hecho, durante la declaración de la variable no es preciso que indiquemos un tipo base; por ejemplo con la línea:

Dim miColeccion as New Collection

Ya tendremos a nuestra disposición una nueva variable sobre la cual ir guardando cualquier tipo de datos que queramos, siempre y cuando se corresponda con un tipo previamente definido claro está.

A diferencia de lo que vimos con los Array, otra de las particularidades con las Collection es que la asignación de valores se realiza de forma asociativa, sin la necesidad de emplear específicamente un índice. Todo lo que debemos es asociar el dato a guardar con una clave de texto (tipo string) que utilizaremos posteriormente para recuperar dicho dato.

Adicionalmente, a la hora de referenciar los datos también podemos utilizar un índice numérico, teniendo en cuenta que el primero de los elementos guardados obtiene el índice 1 (a diferencia de los Array, donde se emplea un índice base 0).

Para añadir nuevas entradas a una variable de tipo Collection utilizaremos el método add. Por ejemplo:

miColeccion.add "Javier", "Nombre",

miColeccion.add "Rodriguez", "Apellido" 

miColeccion.add "@bloguintosh", "Twitter" 

miColeccion.add "Xojo", "Lenguaje"

miColeccion.add 44, "edad"

miColeccion.add miFoto, "fotografia"

Como puedes ver, la estructura de una Collection es muy similar a la que tendría un registro de una base de datos, además de que efectivamente podemos guardar tanto datos de tipo string, enteros y de imagen (Picture) tal y como se muestra en el ejemplo mediante la correspondencia ‘miFoto, “fotografía”‘.

Ahora bien, para obtener el dato almacenado en cualquiera de los campos utilizados en una Collection utilizaremos el método Item. Ya hemos indicado que podremos utilizar el texto asociado como clave o bien su posición (a modo de índice). Por tanto, lo siguiente sería equivalente:

MsgBox miColeccion.item(4)

MsgBox.miColeccion.item("lenguaje")

Una ventaja es que, a la hora de utilizar la clave de texto asociada, Xojo no hace distinciones entre mayúsculas y minúsculas. Si te fijas, al definir el campo durante la asignación del valor utilizamos “Lenguaje” con la ‘L’ mayúscula, mientras que en la operación de referencia empleamos “lenguaje”, con la ‘l’ minúscula. De hecho también habría sido válido (y un tanto esquizofrénico) si hubiésemos utilizado:

MsgBox.miColeccion.item("LeNgUaJe")

Ahora bien, prueba lo siguiente:

MsgBox miColeccion.item(0)

 

Si todo ha ido bien, la app te habrá llevado directamente a la ventana del depurador y habrás obtenido una vista similar a la mostrada en la imagen, donde se muestra un error del tipo “Out Of Bound Exception”; es decir, se ha producido una excepción al intentar acceder una colección fuera de sus límites. (Avance: mira bien la esquina inferior derecha de la imagen. Ahí puedes ver la estructura interna de un objeto de tipo Collection. Lo especialmente interesante es que el objeto Collection utiliza el tipo de dato Pair y que también veremos en esta misma serie para almacenar colecciones de datos.)

¿Por que se ha producido este error? Probablemente recuerdes que se trata el mismo error que obteníamos cuando utilizábamos el índice ‘-1’ o bien un valor superior a la cantidad de elementos contenidos por el Array durante el acceso a los datos contenidos en la lista. En este caso es exactamente lo mismo, salvo que el límite inferior en el caso de las Collection es ‘1’ en vez de ‘0’. Por tanto, el valor ‘0’ está por debajo del mínimo aceptable.

Es precisamente esta diferencia del índice base (1 o 0) uno de los bugs más frecuentes con los que te puedes topar durante tus primeros programas en Xojo, dado que algunas clases emplean el índice base ‘0’ (como los Array), mientras que en otros es ‘1’, como en las Collection.

(Afortunadamente, Xojo ya ha indicado que en una próxima reorganización del framework se mejorará la coherencia de este tipo de cosas, de modo que todos los índices base pasen a ser ‘0’. Problema resuelto, aunque habrá que esperar.)

Obviamente, si en nuestro ejemplo utilizamos la siguiente línea obtendremos el mismo error, dado que en este caso nos pasaremos por “arriba”; es decir, el índice máximo teniendo en cuenta la cantidad de campos guardados hasta el momento por la colección:

MsgBox miColeccion.item(7)

Como recordarás, en los Array utilizamos el método ubound para obtener el índice máximo que podemos utilizar para referencia un valor de la lista. En el caso de las Collection hemos de utilizar el método Count. De este modo:

Dim i as integer = miColeccion.count

MsgBox miColeccion.item(i)

o

MsgBox miColeccion.item(miColeccion.count)

Son las fórmulas que podemos utilizar para mostrar en todo momento el dato del último campo disponible en nuestra colección (¡asumiendo en todo momento que este fuese de tipo String!).

Por otra parte, podremos eliminar un elemento de la colección utilizando el método Remove y pasando como parámetro (entre paréntesis) bien la clave textual asociada o bien su índice, de modo que estas expresiones serán equivalentes:

miColeccion.Remove( "fotografia" )

miColeccion.Remove( 6 )

miColeccion.Remove( miColeccion.Count )

Rendimiento de Collection

El hecho de que podamos referencia cualquiera de los campos mediante un índice secuencia nos indican un par de cosas. La primera de ellas es que continúa tratándose de una lista ordenada de valores. La segunda no se trata de las mejores de las opciones que puedas utilizar a la hora de trabajar con grandes cantidades de “campos” o elementos, dado que durante las referencias Xojo realizará las búsquedas de forma secuencial.

En una colección corta puede que tenga un gran impacto, pero cuando se trata de Colecciones de cientos o miles de elementos, donde se apliquen una buena cantidad de accesos… puede suponer un considerable sangrado de tiempo en el rendimiento de tu aplicación.

Por tanto, la recomendación que hace Xojo es que nunca utilices las Collection en tus aplicaciones. Está bien conocer que existen y cómo funcionan, especialmente porque podríamos decir que son algo así como el padre del tipo que veremos en la próxima entrada: los Diccionarios.

Adicionalmente, recuerda que Xojo es un entorno de desarrollo multiplataforma con una gran cantidad de años de recorrido, de modo que mantiene el tipo de dato Collection para proporcionar una compatibilidad hacia atrás (muy atrás) del código ya existente y porque, adicionalmente, también facilita la transición de proyectos desde Microsoft Visual Basic hacia el más moderno, potente y multiplataforma Xojo (de hecho existe una utilidad gratuita que facilita la migración de aplicaciones Visual Basic hacia Xojo. Se trata del Asistente de Migración VB.

Enlaces de Interés sobre Xojo

Artículos anteriores

Javier Rodríguez (@bloguintosh) es desarrollador OS X e iOS, director de Macsoluciones.com. Puedes contactar con él para el desarrollo de aplicaciones para Mac e iOS en entornos empresariales así como consultoría y formación.

Dejar un comentario

Twitter
Visit Us
Tweet
YouTube
Pinterest
LinkedIn
Share