Obtención de subarrays a partir de un objeto ArrayList

Obtención de subarrays a partir de un objeto ArrayList

La clase ArrayList nos proporciona métodos tanto para obtener un fragmento o rango (subarray) de un objeto ArrayList, como para crear nuevos objetos mediante métodos shared o compartidos. Entre este tipo de métodos, se encuentran los siguientes.

GetRange(Posición, Elementos). Obtiene un subarray comenzando en el índice Posición, y tomando el número que indica Elementos.

FixedSize(ArrayList). Método compartido que crea un array de tamaño fijo a partir de un objeto ArrayList pasado como parámetro. Sobre el nuevo array obtenido, podemos modificar los elementos existentes, pero no añadir nuevos.

Repeat(Valor, Cantidad). Método compartido que crea un ArrayList de valores repetidos, tomando como valor a repetir el parámetro Valor, y creando tantos elementos como se especifica en el parámetro Cantidad.

ToArray(). Copia los elementos del ArrayList en un objeto Array, al ser ambos arrays independientes, el objeto sobre el que se han copiado los elementos puede modificarse sin que afecte al ArrayList.

ReadOnly( ). Método compartido que crea un objeto ArrayList de sólo lectura a partir de un array existente.

Veamos algunos ejemplos de uso de estos métodos en el Código fuente 371.

Sub Main() Dim alLetras As New ArrayList(10) alLetras.AddRange(New String() {"a", "b", "c", "d", "e", "f", "g"})

Console.WriteLine("Array alLetras") RecorrerAList(alLetras)

' obtener un subarray con un rango determinado Dim alRangoLetras As ArrayList alRangoLetras = alLetras.GetRange(4, 2) Console.WriteLine("Array alRangoLetras") RecorrerAList(alRangoLetras)

' obtener un subarray de tamaño fijo, ' se pueden modificar sus elementos, ' no se pueden añadir valores Dim alLetrasFijo As ArrayList = ArrayList.FixedSize(alLetras) 'alLetrasFijo.Add("m") <-- esto provocaría error alLetrasFijo(2) = "vvv" Console.WriteLine("Array alLetrasFijo") RecorrerAList(alLetrasFijo)

Programación con Visual Basic .NET © Grupo EIDOS

' ArrayList de valores repetidos Dim alRepetidos As ArrayList alRepetidos = ArrayList.Repeat("hola", 3) alRepetidos.Add("otro valor") Console.WriteLine("Array alRepetidos") RecorrerAList(alRepetidos)

' copiar ArrayList sobre un array normal Dim aNuevo As Array aNuevo = alLetras.ToArray() aNuevo(2) = "zzz" Console.WriteLine("Array aNuevo") RecorrerArray(aNuevo)

' crear ArrayList de sólo lectura ' a partir de un array existente Dim alLetrasSoloLeer As ArrayList = ArrayList.ReadOnly(alLetras) ' solamente podemos recorrerlo Console.WriteLine("ArrayList de sólo lectura") RecorrerAList(alLetrasSoloLeer)

' las dos líneas siguientes provocarían un error 'alLetrasSoloLeer.Add("yyy") 'alLetrasSoloLeer(2) = "wwer"

Console.ReadLine() End Sub

Private Sub RecorrerAList(ByVal alValores As ArrayList) Dim oEnumerador As IEnumerator = alValores.GetEnumerator() While oEnumerador.MoveNext()

Console.WriteLine("Valor: {0}", oEnumerador.Current) End While Console.WriteLine()

End Sub

Private Sub RecorrerArray(ByVal aValores As Array) Dim oEnumerador As IEnumerator = aValores.GetEnumerator() While oEnumerador.MoveNext

Console.WriteLine("Valor: {0}", oEnumerador.Current) End While Console.WriteLine()

End Sub

Código fuente 371

Respecto a los ArrayList de tamaño fijo, tipo FixedSize, queremos advertir al lector que a la hora de ver su contenido en el depurador, no debe consultar la propiedad _items mencionada anteriormente, ya que esta contendrá un array de valores vacíos.

Este punto puede crear confusión, ya que el lector al ejecutar la aplicación sí obtendrá los valores de la colección FixedSize, por lo que se preguntará dónde han ido a parar esos valores.

El secreto reside en el siguiente lugar: al ejecutar con el depurador, debemos expandir la propiedad [System.Collections.ArrayList.FixedSizeArrayList] del ArrayList con tamaño fijo. Dentro de esta propiedad, que es realmente una variante del objeto ArrayList, abriremos la propiedad _list, y de nuevo dentro de esta propiedad encontraremos otra con el nombre _items, la cual será la que contiene realmente los valores del array de tamaño fijo. La Figura 213 muestra la ventana Locales del depurador ejecutando el ejemplo.

© Grupo EIDOS 24. Colecciones

Figura 213. Acceso a la lista de valores de un ArrayList de tipo FixedSize.