viernes, 10 de mayo de 2024

OOo Basic. Datos.

 Matriz de matrices

Además de las [matrices multidimensionalestambién podemos trabajar con matrices que, en lugar de datos individuales, trabaje con colecciones de datos o matrices. Las matrices de matrices, que son de las que hablamos ahora, se parecen  a las [matrices unidimensionales], pero son mucho más potentes.



La declaración de una matriz de matrices no difiere de la de una matriz unidimensional (Dim mDatos(2) As Variant) (1), siento únicamente la asignación de contenidos la que permite definirla. Por ejemplo:

Dim mDatos(2) As Variant
mDatos(0) = 1
mDatos(1) = "33012"
mDatos(2) = "Jorge López"
 
... es una matriz unidimensional variant, pero...

Dim mDatos(2) As Variant

mDatos(0) = Array("Perro","Gato","Oso","Tiburón","Burro")
mDatos(1) = Array("Cedro","Pino","Caoba","Fresno")
mDatos(2) = Array(("Cobre","Plata","Manganeso","Azufre","Potasio","Hierro")

 ... es una matriz de matrices, ya que cada uno de sus componentes es, a su vez, una matriz unidimensional (2)

Las matrices de matrices presentan una peculiaridad en cuanto a su manejo, ya que para hacer referencia a un elemento concreto deberemos indicar dos índices: el primero, el de la matriz principal, y el segundo, el de la secundaria. Así, por ejemplo, para acceder al componente "Perro", deberemos hacerlo de este modo:

mDatos (0)(0)

... ya que ocupa la posición 0 (inicial) en la matriz principal y también la posición 0 en la matriz a la que pertenece (3)

Pero esta no es la única forma de acceder a los datos internos de una matriz de matrices. También podemos hacerlo creando una matriz temporal a la que asociamos los elementos de la matriz principal. Veamos un ejemplo.

Dim mDatos(2) As Variant
Dim mTmp As Variant
Dim i As Integer, a As Integer

mDatos(0) = Array("Perro","Gato","Oso","Tiburón","Burro")
mDatos(1) = Array("Cedro","Pino","Caoba","Fresno")
mDatos(2) = Array("Cobre","Plata","Manganeso","Azufre","Potasio","Hierro")


mTmp() = mDatos(0)
For i=LBound(mTmp()) To UBound(mTmp())
MsgBox mTmp(i)
Next

mTmp() = mDatos(1)
For i=LBound(mTmp()) To UBound(mTmp())
MsgBox mTmp(i)
Next

mTmp() = mDatos(2)
For i=LBound(mTmp()) To UBound(mTmp())
MsgBox mTmp(i)
Next

For i = 0 To 2
mTmp = mDatos(i)
MsgBox mTmp(i)
Nex

 

For i = 0 To 2
mTmp = mDatos(i)
For a= LBound(mTmp()) To UBound(mTmp())
MsgBox mTmp(a)
Next
Next

  • El primer procedimiento (que se repite tres veces) resulta de combinar la asignación del elemento de la matriz principal a la variable/matriz auxiliar y el uso del bucle para acceder a cada elemento de la matriz auxiliar.
  • El segundo procedimiento únicamente nos devuelve tres datos: el primero de la primera matriz secundaria, el segundo de la segunda matriz secundaria y el tercero de la tercera matriz secundaria.
  • En tercer procedimiento empleamos una estructura de bucle anidado y dos contadores. El primer bucle recorre la matriz principal y el segundo la matriz auxiliar, lo que equivale a recorres las matrices secundarias que previamente han sido asignadas a la auxiliar (4).



NOTAS

(1) En principio puede entenderse como una matriz unidimensional simple cuyos elementos pueden ser datos de distinto tipo, de ahí declararla de tipo Variant. Por otra parte, una matriz de matrices es de tipo Variant, ya que una matriz no es un dato, sino una colección de datos, lo que obliga a considerarla como Variant. Aun aunque TODOS los elementos de TODAS las matrices elementos de la matriz principal sean de un único tipo.

(2) En este caso, ya que hasta donde yo se nada impide que una matriz incluida como elemento componente de  otra no pueda se, a su vez, multidimensional. Otra cosa es que resulte más o menos sencillo manejar este tipo de matriz, dada su complejidad. Y otra más aun que nos resulte de utilidad para el desarrollo del tipo de script que podemos necesitar.

(3) Por la misma razón decir mDatos(1)(0) es lo mismo que decir (en el ejemplo anterior) "Cedro". Si ambas matrices secundarias se definieran previamente como tales (y no como meros Array), por ejemplo como mAnimal() y mArbol, respectivamente, decir mAnimal(0) sería equivalente a decir mDatos(0)(0), o mArbol(0) lo mismo que mDatos(1)(0)

(4) Resulta interesante observar el diferente comportamiento de los tres procedimiento y nos debe servir para hacer un uso correcto de ellos en función del objetivo. No debemos olvidar que disponemos de dos formas distintas de acceder a los datos de la matriz principal, cada uno con sus posibles ventajas y limitaciones.

No hay comentarios:

Publicar un comentario

Comenta esta entrada