Programación en Visual Basic Lección #7: Arreglos Por Antonio F. Huertas
Contenido Arreglos Colecciones Estructuras Tipos de datos enumerados Arreglos unidimensionales Areglos bidimensionales Uso de ReDim y ReDim Preserve para arreglos dinámicos Colecciones Colección ArrayList Colección SortedList Estructuras Tipos de datos enumerados
Arreglos Un arreglo es un conjunto de valores de la misma clase almacenados en memoria primaria. A cada valor en un arreglo se le llama elemento y se identifica usando el nombre del arreglo y su posición con respecto al inicio del arreglo (el índice). En Visual Basic .NET todos los arreglos comienzan en el índice 0.
Arreglos unidimensionales Un arreglo unidimensional es una lista de valores de la misma clase. Declaración: Dim nombreArreglo(límiteSuperior) As tipoDatos Ej.: Dim list(5) As Integer Ej.: Dim list() As Integer = {1, 2, 3, 4, 5, 6} Se creó el arreglo unidimensional list con 6 elementos en los índices 0 al 5.
Arreglos unidimensionales (cont.) Acceso directo al elemento en el índice 3 (en otras palabras, el cuarto elemento): Ej.: MsgBox(list(3)) Recorriendo el arreglo unidimensional secuencialmente: For n = 0 To 5 MsgBox("Index: " & n & vbTab & _ "Value: " & list(n)) Next
Arreglos bidimensionales Un arreglo bidimensional es una tabla de valores de la misma clase. Declaración: Dim nombreArreglo(límiteSuperiorFilas, límiteSuperiorColumnas) As tipoDatos Ej.: Dim table(3, 1) As Integer Ej.: Dim table(,) As Integer = _ {{1, 2}, {3, 4}, {5, 6}, {7, 8}} Se creó el arreglo bidimensional table con 4 filas (índices 0 al 3) y 2 columnas (índices 0 a 1).
Arreglos bidimensionales (cont.) Acceso directo al elemento en la fila con índice 2 y columna con índice 0: Ej.: MsgBox(table(2,0)) Recorriendo el arreglo bidimensional secuencialmente (para cada fila, se visitan todas las columnas de la fila): For r = 0 To 3 For c = 0 To 1 MsgBox("Row: " & r & " " & "Col: " & c & _ "Value: " & table(r, c)) Next
Uso de ReDim y ReDim Preserve para arreglos dinámicos En Visual Basic .NET es posible crear arreglos dinámicos, o sea arreglos cuyo tamaño puede variar durante la ejecución del programa. Para manipular dinámicamente el tamaño de un arreglo se usan ReDim y ReDim Preserve. ReDim es útil para crear un arreglo dinámicamente: Dim list() As Integer Dim capacity As Integer capacity = Val(InputBox("Enter capacity of array:")) ReDim list(capacity – 1)
Uso de ReDim y ReDim Preserve para arreglos dinámicos (cont.) Para cambiar el tamaño de un arreglo dinámicamente se usa normalmente ReDim Preserve (preserva el contenido): If size = capacity Then capacity = capacity * 1.5 ReDim Preserve list(capacity – 1) End If La instrucción ReDim Preserve es computacionalmente costosa ya que debe reservar una serie de localizaciones continuas de memoria y copiar los elementos del arreglo original a estas localizaciones.
Uso de ReDim y ReDim Preserve para arreglos dinámicos (cont.) Una alternativa para recorrer los arreglos dinámicos secuencialmente es el uso de la función UBound(). La función UBound()devuelve el límite superior del arreglo. For n = 0 To UBound(list) MsgBox("Index: " & n & vbTab & _ "Value: " & list(n)) Next
Arreglos: otras consideraciones A diferencia de las variables simples, los arreglos son referencias. El nombre del arreglo contiene la dirección del primer elemento. Para copiar un arreglo a otro se tiene que usar el método Clone: Dim arr1() As Integer = {0,1, 2, 3} Dim arr2() As Integer arr2 = arr1.Clone Si no se usa Clone, los cambios en el arreglo arr2 se reflejarán también en el arreglo arr1 ya que apuntarían al mismo sitio.
Arreglos: otras consideraciones (cont.) Los parámetros que representan arreglos pueden ser por valor (ByVal) o por referencia (ByRef). En ambos casos el parámetro contendrá la dirección del arreglo y cambios al parámetro afectarán al arreglo original. Pasar un arreglo por valor o por referencia sólo hace una diferencia si se usa un ReDim dentro del procedimiento. Si se desea modificar el arreglo original, se debe usar un parámetro por referencia.
Arreglos: otras consideraciones (cont.) Dim capacity As Integer = 10 Private Sub ReadArray(ByVal fileNumber As Integer, _ ByRef list() As Single, _ ByRef sizeList As Integer) sizeList = 0 FileOpen(fileNumber, "data.txt", OpenMode.Input) Do While Not EOF(fileNumber) If sizeList = capacity Then capacity = 1.5 * capacity ReDim Preserve list(capacity – 1) End If Input(fileNumber, list(sizeList)) sizeList += 1 Loop FileClose(fileNumber) End Sub