Las matrices multidimensionales y las matrices escalonadas (jagged arrays) son dos construcciones diferentes para trabajar con colecciones en Visual Basic. Originalmente, VB (VB6, .NET) solo admitía matrices rectangulares (bidimensionales, tridimensionales). Más tarde, en .NET, se añadió soporte para matrices escalonadas como un objeto separado.
Las matrices multidimensionales tradicionales (por ejemplo, Dim matrix(2,3) As Integer) son útiles cuando la tabla de datos debe ser necesariamente rectangular. Las matrices escalonadas se introdujeron en VB.NET con la posibilidad de crear filas irregulares: el número de elementos en la matriz interna puede variar.
La elección incorrecta del enfoque conduce a un uso ineficiente de la memoria (por ejemplo, en matrices rectangulares, todas las filas son fijas) o a una lógica incorrecta para acceder a los elementos (puede ocurrir un error de acceso fuera de rango). A menudo se confunden la sintaxis y los métodos de inicialización.
Se eligen matrices rectangulares (multidimensionales) si el contenido siempre está completo (por ejemplo, un campo de juego). Las matrices escalonadas se usan cuando las filas tienen diferentes longitudes (por ejemplo, listas de alumnos en diferentes clases). El acceso a los elementos entre ellas difiere.
Ejemplo de código:
' Matriz multidimensional Dim rect(1, 2) As Integer ' 2 filas, 3 columnas (indexación desde cero) rect(0,0) = 1 : rect(0,1) = 2 : rect(0,2) = 3 rect(1,0) = 4 : rect(1,1) = 5 : rect(1,2) = 6 ' Matriz escalonada Dim jagged(2)() As Integer ' matriz de 3 elementos, cada uno de los cuales es una matriz jagged(0) = New Integer() {1, 2} jagged(1) = New Integer() {3, 4, 5} jagged(2) = New Integer() {6} Console.WriteLine(rect(1,2)) ' 6 Console.WriteLine(jagged(1)(2)) ' 5
Características clave:
¿Se puede definir una matriz escalonada usando Dim a(2,3) As Integer?
Respuesta: No, esto creará una matriz rectangular. Las matrices escalonadas se definen así: Dim a(2)() As Integer o Dim a As Integer()().
¿Qué pasará si no se inicializa la matriz interna de la estructura escalonada y se intenta acceder a un elemento?
Respuesta: Se lanzará una excepción NullReferenceException, ya que la matriz interna no se ha creado.
¿Cuál es la diferencia en la sintaxis para obtener la longitud de la dimensión de una matriz unidimensional y de una matriz escalonada?
Respuesta: Para una rectangular: a.GetLength(0) (número de filas), a.GetLength(1) (número de columnas). Para escalonada: a.Length (número de filas), a(i).Length (número de elementos en la fila i).
Para almacenar una lista de alumnos por clase, se eligió una matriz rectangular (10, 30) — los elementos vacíos no se utilizan, algunas clases tienen menos del número máximo de alumnos.
Ventajas:
Desventajas:
Se utiliza una matriz escalonada: cada matriz interna es una lista real de alumnos de la clase, optimización de memoria y simplicidad en el procesamiento.
Ventajas:
Desventajas: