Matrices en Visual Basic
Una matriz es un conjunto de valores relacionados lógicamente entre sí, como el número de estudiantes de cada curso en una escuela primaria.
Usando una matriz, puede hacer referencia a estos valores relacionados mediante un mismo nombre y utilizar un número, denominado índice o subíndice, para distinguirlos. Los valores individuales se llaman elementos de la matriz. Son contiguos desde el índice 0 hasta el valor del índice superior.
A diferencia de una matriz, una variable que contiene un único valor se llama variable escalar.
En este tema
Elementos matriciales en una simple matriz
Crear una matriz
Declarar una matriz
Almacenar valores en una matriz
Rellenar una matriz con valores iniciales
- Literales de matriz anidados
Recorrer en iteración una matriz
Matrices como valores devueltos y parámetros
Matrices escalonadas
Matrices de longitud cero
Tamaño de una matriz
Tipos de matriz y otros tipos
Colecciones como alternativa a las matrices
Elementos matriciales en una simple matriz
En el ejemplo siguiente se declara una variable de matriz para que contenga el número de estudiantes de cada curso en una escuela primaria.
Dim students(6) As Integer
La matriz students del ejemplo anterior contiene siete elementos. Los índices de los elementos van de 0 a 6. Tener esta matriz es más fácil que declarar siete variables diferentes.
En la siguiente ilustración se muestra la matriz students. Para cada elemento de la matriz:
El índice del elemento representa el curso (el índice 0 representa el jardín de infancia).
El valor contenido en el elemento representa el número de estudiantes en ese curso.
Elementos de la matriz "students"
En el ejemplo siguiente se muestra cómo hacer referencia al primer, segundo y último elemento de la matriz students.
Dim kindergarten As Integer = students(0)
Dim firstGrade As Integer = students(1)
Dim sixthGrade As Integer = students(6)
MsgBox("Students in kindergarten = " & CStr(kindergarten))
MsgBox("Students in first grade = " & CStr(firstGrade))
MsgBox("Students in sixth grade = " & CStr(sixthGrade))
Puede hacer referencia a la matriz en conjunto utilizando simplemente el nombre de la variable de la matriz sin índices.
La matriz students del ejemplo anterior utiliza un índice y se dice que es unidimensional. Una matriz que utiliza más de un índice o subíndice se denomina multidimensional. Para obtener más información, vea el resto de este tema y Dimensiones de matrices en Visual Basic.
Crear una matriz
Se puede definir el tamaño de una matriz de varias maneras. Puede proporcionar el tamaño cuando se declara la matriz, como se muestra en el ejemplo siguiente.
Dim cargoWeights(10) As Double
Dim atmospherePressures(2, 2, 4, 10) As Short
Dim inquiriesByYearMonthDay(20)()() As Byte
También puede usar una cláusula New para proporcionar el tamaño de una matriz al crearla, como muestra el ejemplo siguiente.
cargoWeights = New Double(10) {}
atmospherePressures = New Short(2, 2, 4, 10) {}
inquiriesByYearMonthDay = New Byte(20)()() {}
Si se tiene una matriz existente, se puede volver a definir su tamaño utilizando la instrucción Redim. Puede especificar que la instrucción Redim deba mantener los valores que se encuentren en la matriz o que cree una nueva matriz vacía. En el ejemplo siguiente se muestran usos diferentes de la instrucción Redim para modificar el tamaño de una matriz existente.
' Assign a new array size and retain the current element values.
ReDim Preserve cargoWeights(20)
' Assign a new array size and retain only the first five element values.
ReDim Preserve cargoWeights(4)
' Assign a new array size and discard all current element values.
ReDim cargoWeights(15)
Para obtener más información, vea Instrucción ReDim (Visual Basic).
Declarar una matriz
Una variable de matriz se declara de la misma manera que cualquier otra variable mediante la instrucción Dim. Agregue uno o más pares de paréntesis al nombre de tipo o de variable para indicar que contendrá una matriz en lugar de una variable escalar, que es una variable que contiene un valor único.
Después de declarar la matriz, puede definir su tamaño utilizando Instrucción ReDim (Visual Basic).
El ejemplo siguiente declara una variable de matriz unidimensional agregando un par de paréntesis después del tipo. El ejemplo también especifica las dimensiones de la matriz mediante la Instrucción ReDim (Visual Basic).
' Declare a one-dimensional array.
Dim cargoWeights As Double()
' Dimension the array.
ReDim cargoWeights(15)
El siguiente ejemplo declara una variable de matriz multidimensional agregando un par de paréntesis detrás del tipo y colocando comas dentro de los paréntesis para separar las dimensiones. El ejemplo también especifica las dimensiones de la matriz mediante la Instrucción ReDim (Visual Basic).
' Declare a multidimensional array.
Dim atmospherePressures As Short(,,,)
' Dimension the array.
ReDim atmospherePressures(1, 2, 3, 4)
Para declarar una variable de matriz escalonada, agregue un par de paréntesis después del nombre de variable para cada nivel de matriz anidada.
Dim inquiriesByYearMonthDay()()() As Byte
En los ejemplos anteriores se declaran variables de matriz pero no se les asignan matrices. Debe crear una matriz, inicializarla y asignarla a la variable.
Almacenar valores en una matriz
Se puede tener acceso a cada ubicación en una matriz utilizando un índice de tipo Integer. Se pueden almacenar y recuperar valores en una matriz haciendo referencia a cada ubicación de la matriz utilizando su índice entre paréntesis. Los índices de matrices multidimensionales se separan mediante comas (,). Se necesita un índice para cada dimensión de matriz. El ejemplo siguiente muestra algunas instrucciones que almacenan valores en matrices.
Dim i = 4
Dim j = 2
Dim numbers(10) As Integer
Dim matrix(5, 5) As Double
numbers(i + 1) = 0
matrix(3, j * 2) = j
El ejemplo siguiente muestra algunas instrucciones que reciben valores de las matrices.
Dim v = 2
Dim i = 1
Dim j = 1
Dim k = 1
Dim wTotal As Double = 0.0
Dim sortedValues(5), rawValues(5), estimates(2, 2, 2) As Double
Dim lowestValue = sortedValues(0)
wTotal += (rawValues(v) ^ 2)
Dim firstGuess = estimates(i, j, k)
Rellenar una matriz con valores iniciales
Se puede crear una matriz que contenga un conjunto inicial de valores utilizando un literal de matriz. Un literal de matriz está formado por una lista de valores separados por comas que se encierran entre llaves ({}).
Cuando se crea una matriz utilizando un literal de matriz, se puede proporcionar el tipo de la matriz o usar la inferencia de tipos para determinarlo. El código siguiente muestra ambas opciones.
Dim numbers = New Integer() {1, 2, 4, 8}
Dim doubles = {1.5, 2, 9.9, 18}
Cuando se utiliza la inferencia de tipos, el tipo de la matriz lo determina el tipo dominante en la lista de valores que se proporciona para el literal de matriz. El tipo dominante es un tipo único al que todos los demás tipos en el literal de matriz se pueden ampliar. Si no se puede determinar este tipo único, el tipo dominante es el tipo único al que todos los demás tipos de la matriz se pueden restringir. Si no se puede determinar ninguno de estos tipos únicos, el tipo dominante es Object. Por ejemplo, si la lista de valores proporcionada al literal de matriz contiene valores de tipo Integer, Long y Double, la matriz resultante es de tipo Double. Tanto Integer como Long se amplían solo a Double. Por consiguiente, Double es el tipo dominante. Para obtener más información, vea Conversiones de ampliación y de restricción (Visual Basic). Estas reglas de inferencia se aplican a tipos deducidos para matrices que son variables locales definidas en un miembro de clase. Aunque se pueden utilizar literales de matriz al crear variables de nivel de clase, no se puede usar la inferencia de tipos en el nivel de clase. Como resultado, los literales de matriz que se especifican en el nivel de clase deducen los valores proporcionados para el literal de matriz como tipo Object.
Se puede especificar explícitamente el tipo de los elementos de una matriz que se crea utilizando un literal de matriz. En este caso, los valores del literal de matriz se deben ampliar al tipo de los elementos de la matriz. En el ejemplo de código siguiente se crea una matriz de tipo Double a partir de una lista de enteros.
Dim values As Double() = {1, 2, 3, 4, 5, 6}
Literales de matriz anidados
Se puede crear una matriz multidimensional utilizando los literales de matriz anidados. Los literales de matriz anidados deben tener una dimensión y un número de dimensiones, o rango, que sea coherente con la matriz resultante. En el ejemplo de código siguiente se crea una matriz bidimensional de enteros utilizando un literal de matriz.
Dim grid = {{1, 2}, {3, 4}}
En el ejemplo anterior, se produciría un error si el número de elementos en los literales de matriz anidados no coincidiese. También se produciría un error si declara explícitamente que la variable de la matriz no es bidimensional.
Nota
Para evitar que se produzca un error al proporcionar literales de matriz anidados de dimensiones diferentes, se deben encerrar entre paréntesis los literales de matriz internos.Los paréntesis exigen la evaluación de la expresión literal de matriz y los valores resultantes se utilizan con el literal de matriz externo, como muestra el siguiente código.
Dim values = {({1, 2}), ({3, 4, 5})}
Cuando se crea una matriz multidimensional utilizando literales de matriz anidados, se puede utilizar la inferencia de tipos. Cuando se utiliza la inferencia de tipos, el tipo deducido es el tipo dominante para todos los valores de todos los literales de matriz en un nivel de anidamiento. En el ejemplo de código siguiente, se crea una matriz bidimensional de tipo Double a partir de valores que son de tipo Integer y Double.
Dim a = {{1, 2.0}, {3, 4}, {5, 6}, {7, 8}}
Para obtener otros ejemplos, vea Cómo: Inicializar una variable de matriz en Visual Basic.
Recorrer en iteración una matriz
Cuando itera por una matriz, tiene acceso a cada elemento de la matriz desde el índice inferior al índice superior.
En el ejemplo siguiente se recorre en iteración una matriz unidimensional usando la Instrucción For...Next (Visual Basic). El método GetUpperBound devuelve el valor máximo que puede tener el índice. El valor de índice mínimo es siempre 0.
Dim numbers = {10, 20, 30}
For index = 0 To numbers.GetUpperBound(0)
Debug.WriteLine(numbers(index))
Next
' Output:
' 10
' 20
' 30
En el ejemplo siguiente se recorre en iteración una matriz multidimensional usando una instrucción For...Next. El método GetUpperBound tiene un parámetro que especifica la dimensión. GetUpperBound(0) devuelve el valor de índice alto para la primera dimensión, y GetUpperBound(1) devuelve el valor de índice alto para la segunda dimensión.
Dim numbers = {{1, 2}, {3, 4}, {5, 6}}
For index0 = 0 To numbers.GetUpperBound(0)
For index1 = 0 To numbers.GetUpperBound(1)
Debug.Write(numbers(index0, index1).ToString & " ")
Next
Debug.WriteLine("")
Next
' Output
' 1 2
' 3 4
' 5 6
En el ejemplo siguiente se recorre en iteración una matriz unidimensional usando una Instrucción For Each...Next (Visual Basic).
Dim numbers = {10, 20, 30}
For Each number In numbers
Debug.WriteLine(number)
Next
' Output:
' 10
' 20
' 30
En el ejemplo siguiente se recorre en iteración una matriz multidimensional usando una instrucción For Each...Next. Sin embargo, tiene más control sobre los elementos de una matriz multidimensional si utiliza una instrucción For…Next anidada, como en el ejemplo anterior, en lugar de una instrucción For Each…Next.
Dim numbers = {{1, 2}, {3, 4}, {5, 6}}
For Each number In numbers
Debug.WriteLine(number)
Next
' Output:
' 1
' 2
' 3
' 4
' 5
' 6
Matrices como valores devueltos y parámetros
Para devolver una matriz de un procedimiento Function, especifique el tipo de datos de matriz y el número de dimensiones como tipo de valor devuelto de Function (Instrucción, Visual Basic). Dentro de la función, declare una variable de matriz local con el mismo tipo de datos y número de dimensiones. En Return (Instrucción, Visual Basic), incluya la variable de matriz local sin paréntesis.
Para especificar una matriz como parámetro para un procedimiento Sub o Function, defina el parámetro como matriz con un tipo de datos y un número de dimensiones especificados. En la llamada al procedimiento, envíe una variable de matriz con el mismo tipo de datos y número de dimensiones.
El ejemplo siguiente la función GetNumbers devuelve un Integer(). Este tipo de matriz es una matriz unidimensional de tipo Integer. El procedimiento ShowNumbers acepta un argumento Integer().
Public Sub Process()
Dim numbers As Integer() = GetNumbers()
ShowNumbers(numbers)
End Sub
Private Function GetNumbers() As Integer()
Dim numbers As Integer() = {10, 20, 30}
Return numbers
End Function
Private Sub ShowNumbers(numbers As Integer())
For index = 0 To numbers.GetUpperBound(0)
Debug.WriteLine(numbers(index) & " ")
Next
End Sub
' Output:
' 10
' 20
' 30
El ejemplo siguiente la función GetNumbersMultiDim devuelve un Integer(,). Este tipo de matriz es una matriz bidimensional de tipo Integer. El procedimiento ShowNumbersMultiDim acepta un argumento Integer(,) .
Public Sub ProcessMultidim()
Dim numbers As Integer(,) = GetNumbersMultidim()
ShowNumbersMultidim(numbers)
End Sub
Private Function GetNumbersMultidim() As Integer(,)
Dim numbers As Integer(,) = {{1, 2}, {3, 4}, {5, 6}}
Return numbers
End Function
Private Sub ShowNumbersMultidim(numbers As Integer(,))
For index0 = 0 To numbers.GetUpperBound(0)
For index1 = 0 To numbers.GetUpperBound(1)
Debug.Write(numbers(index0, index1).ToString & " ")
Next
Debug.WriteLine("")
Next
End Sub
' Output
' 1 2
' 3 4
' 5 6
Matrices escalonadas
Una matriz que contiene otras matrices como elementos se conoce como una matriz de matrices o una matriz escalonada. Una matriz escalonada y cada elemento de una matriz escalonada pueden tener una o varias dimensiones. En algunas ocasiones, la estructura de datos de la aplicación es bidimensional pero no rectangular.
El ejemplo siguiente tiene una matriz de meses, siendo cada elemento a su vez una matriz de días. Puesto que los distintos meses tienen un número distinto de días, los elementos no forman una matriz bidimensional rectangular. Por consiguiente, se utiliza una matriz escalonada en lugar de una matriz multidimensional.
' Declare the jagged array.
' The New clause sets the array variable to a 12-element
' array. Each element is an array of Double elements.
Dim sales()() As Double = New Double(11)() {}
' Set each element of the sales array to a Double
' array of the appropriate size.
For month As Integer = 0 To 11
Dim days As Integer =
DateTime.DaysInMonth(Year(Now), month + 1)
sales(month) = New Double(days - 1) {}
Next month
' Store values in each element.
For month As Integer = 0 To 11
Dim upper = sales(month).GetUpperBound(0)
For day = 0 To upper
sales(month)(day) = (month * 100) + day
Next
Next
Matrices de longitud cero
Una matriz sin elementos se llama también una matriz de longitud cero. Un variable que contiene una matriz de longitud cero no tiene el valor Nothing. Para crear una matriz que no tenga elementos, declare que una de las dimensiones de la matriz sea -1, como se muestra en el ejemplo siguiente.
Dim twoDimensionalStrings(-1, 3) As String
Podría necesitar crear una matriz de longitud cero en las circunstancias siguientes:
Sin arriesgarse a una excepción NullReferenceException, el código debe tener acceso a miembros de la clase Array, tales como Length o Rank o llamar a una función Visual Basic tal como UBound.
Desea que el código utilizado sea más sencillo sin tener que comprobar Nothing como caso especial.
El código interactúa con una interfaz de programación de aplicaciones (API) que le exige que pase una matriz de longitud cero a uno o más procedimientos o que devuelve una matriz de longitud cero desde uno o más procedimientos.
Tamaño de una matriz
El tamaño de una matriz es el producto de las longitudes de todas sus dimensiones. Representa el número total de elementos contenido actualmente en la matriz.
A continuación, se muestra un ejemplo de declaración de una matriz tridimensional.
Dim prices(3, 4, 5) As Long
El tamaño total de la matriz en la variable prices es (3 + 1) x (4 + 1) x (5 + 1) = 120.
Se puede buscar el tamaño de una matriz utilizando la propiedad Length. Se puede encontrar la longitud de cada dimensión de una matriz multidimensional utilizando el método GetLength.
Se puede cambiar el tamaño de una variable de matriz asignándole un nuevo objeto de matriz o utilizando la instrucción ReDim.
Se deben tener presentes varias cosas cuando se trata con el tamaño de una matriz.
Longitud de la dimensión |
El índice de cada dimensión está basado en 0, lo que significa que va desde 0 hasta su límite superior. Por consiguiente, la longitud de una dimensión determinada supera en 1 al límite superior declarado para esa dimensión. |
Límites de longitud |
La longitud de cada dimensión de una matriz está limitada al valor máximo del tipo de datos Integer que es (2 ^ 31) - 1. No obstante, la memoria disponible en el sistema limita también el tamaño total de una matriz. Si intenta inicializar una matriz que supera la cantidad de memoria RAM disponible, Common Language Runtime produce una excepción OutOfMemoryException. |
Tamaño y tamaño de elementos |
El tamaño de una matriz es independiente del tipo de datos de sus elementos. El tamaño siempre representa el número total de elementos, no el número de bytes que utilizan en el almacenamiento. |
Consumo de memoria |
No es seguro dar nada por supuesto en lo que respecta al modo de almacenar una matriz en la memoria. El almacenamiento varía en función de las plataformas de diferentes anchos de datos, por lo que la misma matriz puede utilizar más memoria en un sistema de 64 bits que en un sistema de 32 bits. Según la configuración del sistema cuando inicializa una matriz, Common Language Runtime (CLR) puede asignar el almacenamiento para empaquetar los elementos tan juntos como sea posible o para alinearlos todos en los límites naturales del hardware. Asimismo, una matriz requiere una sobrecarga de almacenamiento para obtener su información de control y esta sobrecarga aumenta con cada dimensión agregada. |
Tipos de matriz y otros tipos
Cada matriz tiene un tipo de datos, pero difiere del tipo de datos de sus elementos. No existe ningún tipo de datos para todas las matrices. En su lugar, el tipo de datos de una matriz lo determina el número de dimensiones, o rango, de la matriz y el tipo de datos de los elementos de la matriz. Se considera que dos variables de matriz son del mismo tipo de datos sólo cuando tienen el mismo rango y sus elementos tienen el mismo tipo de datos. Las longitudes de las dimensiones de una matriz no influyen en el tipo de datos de la matriz.
Cada matriz hereda de la clase Array y puede declarar una variable que sea de tipo Array pero no puede crear una matriz de tipo Array. Asimismo, Instrucción ReDim (Visual Basic) no puede funcionar en una variable declarada de tipo Array. Por estas razones y para mayor seguridad del tipo, es aconsejable declarar cada matriz como un tipo específico, como por ejemplo Integer en el ejemplo anterior.
Puede averiguar el tipo de datos de una matriz o de sus elementos de varias maneras.
Llame al método Object.GetType en la variable a fin de recibir un objeto Type para el tipo en tiempo de ejecución de la variable. El objeto Type contiene amplia información en sus propiedades y métodos.
Pase la variable a la función TypeName para recibir un objeto String que contenga el nombre del tipo en tiempo de ejecución.
Pase la variable a la función VarType para recibir un valor VariantType que represente la clasificación de tipo de la variable.
En el ejemplo siguiente se llama a la función TypeName para determinar el tipo de la matriz y el tipo de los elementos de la matriz. El tipo de la matriz es Integer(,) y el tipo de los elementos de la matriz es Integer.
Dim thisTwoDimArray(,) As Integer = New Integer(9, 9) {}
MsgBox("Type of thisTwoDimArray is " & TypeName(thisTwoDimArray))
MsgBox("Type of thisTwoDimArray(0, 0) is " & TypeName(thisTwoDimArray(0, 0)))
Colecciones como alternativa a las matrices
Las matrices son muy útiles para crear y trabajar con un número fijo de objetos fuertemente tipados. Las colecciones proporcionan un método más flexible para trabajar con grupos de objetos. A diferencia de las matrices, el grupo de objetos con el que trabaja puede aumentar y reducirse dinámicamente a medida que cambian las necesidades de la aplicación.
Si necesita cambiar el tamaño de una matriz, debe utilizar Instrucción ReDim (Visual Basic). Si hace esto, Visual Basic crea una nueva matriz y libera la matriz anterior para su eliminación. Esto requiere tiempo de ejecución. Por consiguiente, si el número de elementos con los que trabaja cambia a menudo o no puede predecir el número máximo de elementos que necesita, puede obtener un mejor rendimiento utilizando una colección.
Para algunas colecciones, puede asignar una clave a cualquier objeto que incluya en la colección para que pueda recuperar rápidamente el objeto con la clave asignada.
Si su colección se limita a elementos de solo un tipo de datos, puede utilizar una de las clases en el espacio de nombres System.Collections.Generic. Una colección genérica cumple la seguridad de tipos para que ningún otro tipo de datos se pueda agregar a ella. Cuando recupera un elemento de una colección genérica, no tiene que determinar su tipo de datos ni convertirlo.
Para obtener más información sobre las colecciones, vea Colecciones (C# y Visual Basic).
Ejemplo
En el ejemplo siguiente se utiliza la clase genérica List de .NET Framework para crear una colección de listas de objetos Customer.
' Define the class for a customer.
Public Class Customer
Public Property Name As String
' Insert code for other members of customer structure.
End Class
' Create a module-level collection that can hold 200 elements.
Public CustomerList As New List(Of Customer)(200)
' Add a specified customer to the collection.
Private Sub AddNewCustomer(ByVal newCust As Customer)
' Insert code to perform validity check on newCust.
CustomerList.Add(newCust)
End Sub
' Display the list of customers in the Debug window.
Private Sub PrintCustomers()
For Each cust As Customer In CustomerList
Debug.WriteLine(cust)
Next cust
End Sub
La declaración de la colección CustomerFile especifica que sólo puede contener elementos de tipo Customer. También proporciona una capacidad inicial de 200 elementos. El procedimiento AddNewCustomer comprueba la validez del nuevo elemento y, a continuación, lo agrega a la colección. El procedimiento PrintCustomers utiliza un bucle For Each para recorrer la colección y mostrar sus elementos.
Temas relacionados
Término |
Definición |
---|---|
Explica el rango y las dimensiones de las matrices. |
|
Describe cómo se rellenan las matrices con valores iniciales. |
|
Muestra cómo ordenar alfabéticamente los elementos de una matriz. |
|
Describe las reglas y pasos para asignar una matriz a otra variable de matriz. |
|
Describe algunos problemas comunes que surgen al trabajar con matrices. |
Vea también
Referencia
Instrucción Dim (Visual Basic)