Sunteți pe pagina 1din 46

Tema: Colecciones

Docente: Pedro David Coronado Rodríguez

2017-II
IV
I
Colecciones
Orientaciones

• En la presente sesión se inicia con el aspecto teórico. Conforme se


avance el aspecto teórico se realizara los ejemplos de cada uno de
los temas y subtemas.
• Al final de la sesión el docente asignará un ejercicio práctico que
deberá ser presentado al final de la sesión.
ARRAYS

Los arrays, arreglos o mejor conocidos como vectores (o


matrices) que son conocidas por algunos como vectores
multidimensionales, son utilizadas para almacenar un
conjunto de datos.
En el siguiente ejemplo declaramos un array de tipo
String llamado nombres:

Dim nombres() As String


Dim nombres(10) As String
Dim nombres(0 To 10) As String ‘Siempre debe comenzar
en cero.
ARRAYS

En este ejemplo definimos el array nombres y le


asignamos cuatro valores. A continuación definimos otro
array llamado otros y le asignamos lo que tiene nombres.
Por último asignamos un nuevo valor al elemento cero
del array nombres.
Ejemplo:
Dim nombres() As String = {"Juan", "Pepe", "Ana", "Eva"}
Dim otros() As String
otros = nombres
nombres(0) = "Antonio"
• Erase elimina totalmente el array de la memoria. Erase array
• Asignar un valor Nothing al array(asigna valor por defecto),
debido a que los arrays son tipos por referencia. array =
Nothing
ARRAYS

En el siguiente código de ejemplo hacemos una copia del


contenido del array nombres en el array otros, de esta
forma, el cambio realizado en el elemento cero de
nombres no afecta al del array otros.

Ejemplo:
Dim nombres() As String = {"Juan", "Pepe", "Ana", "Eva"}
Dim otros() As String
ReDim otros(nombres.Length)
nombres.CopyTo(otros, 0)
nombres(0) = "Antonio"
Literales de arrays (o matrices)

Ahora, podemos declarar literales de matrices, haciendo


que estas matrices se declaren de acuerdo al tipo de
dato declarado, es decir, infiriendo el tipo de dato en la
declaración.

Dim ejemploInteger = {2009, 2010, 2011, 2012}


ejemploInteger(1) = "s"
Recorrer arrays

• Para realizar un recorrido por los elementos de un


array, disponemos de las funciones LBound( ) y
UBound( ), que devuelven el número de índice
inferior y superior respectivamente del array.
• Length. Esta propiedad de un objeto array devuelve
el número de elementos que contiene.
• GetLowerBound( ), GetUpperBound( ). Estos
métodos de un objeto array, devuelven
respectivamente, el número de índice inferior y
superior de una dimensión del array. El resultado es
el mismo que usando LBound( ) y UBound( ), pero
desde una perspectiva orientada a objetos.
Recorrer arrays

' modo tradicional


Console.WriteLine("Recorrido del array con LBound() y
UBound()")
For iContador = LBound(sNombres) To
UBound(sNombres)
Console.WriteLine("Posicion: {0} - Valor: {1}", _
iContador, sNombres(iContador))
Next
Console.WriteLine()
Recorrer arrays

‘con bucle For Each


Console.WriteLine("Recorrido del array con bucle For
Each")
For Each sUnNombre In sNombres
Console.WriteLine("Nombre actual: {0}", sUnNombre)
Next
Console.WriteLine()
Recorrer arrays

' usando la propiedad Length


Console.WriteLine("Recorrido del array con propiedad Length")
For iContador = 0 To (sNombres.Length - 1)
Console.WriteLine("Posicion: {0} - Valor: {1}", _
iContador, sNombres(iContador))
Next
Console.WriteLine()
Recorrer arrays

' usando los métodos GetLowerBound() y GetUpperBound()


Console.WriteLine("Recorrido del array con métodos GetLowerBound()
y
GetUpperBound()")
For iContador = sNombres.GetLowerBound(0) To
sNombres.GetUpperBound(0)
Console.WriteLine("Posicion: {0} - Valor: {1}", _
iContador, sNombres(iContador))
Next
Console.WriteLine()
Uso del método CreateInstance( ) para establecer el
número de elementos en un array

La clase Array dispone del método compartido


CreateInstance( ), que como su nombre indica, permite
crear una nueva instancia de la clase, es decir un objeto
array, con la particularidad de que en este caso, el número
de elementos del array será realmente el que
establezcamos al llamar a este método.

' crear un array instanciándolo con el método CreateInstance() de la clase Array


Dim sColores As Array
' este array tendrá tres elementos reales que van desde el índice 0 hasta el 2
sColores = Array.CreateInstance(GetType(String), 3)
sColores(0) = "Azul"
sColores(1) = "Rojo"
sColores(2) = "Verde"
Console.WriteLine("Array sColores")
Console.ReadLine()
Ordenación
' ordenar todo el array
Dim sLetras1() As String = {"z", "a", "g", "m", "w", "i", "c", "b"}
Array.Sort(sLetras1)
Console.WriteLine("Ordenar todos el array")
MostrarArray(sLetras1)
' ordenar parte del array
Dim sLetras2() As String = {"z", "a", "g", "m", "w", "i", "c", "b"}
Array.Sort(sLetras2, 4, 3)
Console.WriteLine("Ordenar parte del array")
MostrarArray(sLetras2)
' invertir valores dentro del array
Dim sLetras3() As String = {"z", "a", "g", "m", "w", "i", "c", "b"}
Array.Reverse(sLetras3, 2, 4)
Console.WriteLine("Invertir valores del array")
MostrarArray(sLetras3)
Console.ReadLine()
Búsqueda

Los métodos IndexOf( ) y LastIndexOf( ) de la clase Array,


nos permiten buscar un elemento en un array comenzando
la búsqueda desde el principio o final respectivamente.
' buscar una cadena a partir del índice 0 del array
Console.WriteLine("Paco está en la posición {0}", _
Array.IndexOf(sNombres, "Paco"))
' buscar una cadena a partir del índice 3 del array
Console.WriteLine("Ana está en la posición {0}," & _
" comenzando a buscar desde índice 3", _
Array.IndexOf(sNombres, "Ana", 3))
Búsqueda

' introducir un valor a buscar en el array,


' si no existe se devuelve -1
Dim iPosicionBuscar As Integer
Console.WriteLine("Introducir nombre a buscar")
iPosicionBuscar = Array.IndexOf(sNombres, _Console.ReadLine())
If iPosicionBuscar = -1 Then
Console.WriteLine("El nombre no está en el array")
Else
Console.WriteLine("El nombre está en la posición {0} del array",
_iPosicionBuscar)
End If
Búsqueda

' buscar comenzando por la última posición


Dim iNumeros() As Integer
Dim iUltPosicionBuscar As Integer
iNumeros = New Integer() {10, 20, 30, 10, 50, 60, 10, 70, 80}
Console.WriteLine("El 10 está en la posición {0} comenzando por el
final", _
Array.LastIndexOf(iNumeros, 10))
Console.ReadLine()
Arrays multidimensionales

.NET Framework nos provee también de la capacidad de


crear arrays formados por más de una lista de valores, o lo
que es igual, arrays multidimensionales. Un array de este
tipo, se caracteriza por estar compuesto de varias
dimensiones o listas anidadas al estilo de filas y columnas.
Dim iDatos(2, 4) As Integer
Arrays multidimensionales
' crear array multidimensional y rellenar de valores
Dim iDatos(2, 4) As Integer
iDatos(0, 0) = 1000
iDatos(0, 1) = 2000
iDatos(0, 2) = 3000
iDatos(0, 3) = 4000
iDatos(0, 4) = 5000
iDatos(1, 0) = 25
iDatos(1, 1) = 35
iDatos(1, 2) = 45
iDatos(1, 3) = 55
iDatos(1, 4) = 65
iDatos(2, 0) = 111
iDatos(2, 1) = 222
iDatos(2, 2) = 333
iDatos(2, 3) = 444
iDatos(2, 4) = 555
Arrays multidimensionales

Para recorrer arrays multidimensionales, la clase Array


dispone de varios miembros, algunos de los cuales,
describimos seguidamente.
• Rank. Devuelve el número de dimensiones del array.
• GetLength(Dimension). Devuelve el número de
elementos de la dimensión de array pasada como
parámetro.
• GetLowerBound(Dimension). Devuelve el número de
índice inferior de la dimensión pasada como parámetro.
• GetUpperBound(Dimension). Devuelve el número de
índice superior de la dimensión pasada como parámetro.
Arrays multidimensionales
' el bucle externo recorre la primera dimensión
For iContadorDimUno = iDatos.GetLowerBound(0) To iDatos.GetUpperBound(0)
' aquí obtenemos el número de fila
' que se está procesando
sTextoFila = iContadorDimUno & ControlChars.Tab
‘ este bucle recorre la segunda dimensión
For iContadorDimDos = iDatos.GetLowerBound(1) To iDatos.GetUpperBound(1)
sTextoFila = sTextoFila & iDatos(iContadorDimUno, iContadorDimDos)
& _ControlChars.Tab
Next
' mostrar en la consola el contenido
Console.WriteLine(sTextoFila)
sTextoFila = ""
Next
Colecciones

Colecciones, la especialización de los arrays


Una colección es un objeto que internamente gestiona
un array, pero que está preparado, dependiendo del
tipo de colección, para manejar el array que contiene
de una manera especial; podríamos definirlo como un
array optimizado o especializado en ciertas tareas.
Colecciones

El espacio de nombres System.Collections


Este espacio de nombres del entorno de .NET
Framework, es el encargado de agrupar el conjunto de
clases e interfaces que nos permiten la creación de los
distintos tipos de objetos collection.
Colecciones

ArrayList. Proporciona una colección, cuyo array es


redimensionado dinámicamente.
Hashtable. Las colecciones de este tipo, contienen un array
cuyos elementos se basan en una combinación de clave y valor,
de manera que el acceso a los valores se facilita, al realizarse
mediante la clave.
SortedList. Consiste en una colección ordenada de claves y
valores.
Queue. Representa una lista de valores, en el que el primer valor
que entra, es el primero que sale.
Stack. Representa una lista de valores, en el que el último valor
que entra, es el primero que sale.
Colecciones

La clave se halla en los interfaces


Las clases integrantes de System.Collections implementan en
mayor o menor grado, un conjunto común de interfaces, que
pfroporcionan la funcionalidad para el trabajo con arrays
especializados o colecciones. Entre alguno de los interfaces de
Collections, podemos mencionar los siguientes.
IEnumerable. Proporciona el soporte para recorrer colecciones
de valores.
ICollection. Proporciona las características para manipular el
tamaño, gestionar enumeradores, etc., de listas de valores.
IList. Referencia a una lista de valores que puede ordenarse.
ICloneable. Permite la creación de copias exactas e
independientes de objetos.
Colecciones

La clase ArrayList
Los objetos de tipo colección creados con esta clase,
implementan un array cuyo número de elementos
puede modificarse dinámicamente.

Sub Main()
' crear una lista sin elementos
Dim alEstaciones As New ArrayList()
' crear una lista indicando el número de elementos
' pero sin darles valor
Dim alDatos As New ArrayList(3)
' crear una lista utilizando una colección dinámica
Dim alLetras As New ArrayList(New String() {"a", "b", "c"})
End Sub
Colecciones

Agregar valores a un ArrayList


Una vez creado un ArrayList, podemos utilizar algunos de los métodos
indicados a continuación para añadir valores a la colección.
Add(Valor). Añade el valor representado por Valor.
AddRange(Colección). Añade un conjunto de valores mediante un
objeto del interfaz ICollection, es decir, una colección dinámica creada en
tiempo de ejecución.
Insert(Posición, Valor). Inserta el valor Valor en la posición Posición del
array, desplazando el resto de valores una posición adelante.
InsertRange(Posición, Colección). Inserta un conjunto de valores
mediante una colección dinámica, a partir de una posición determinada
dentro del array.
SetRange(Posición, Colección). Sobrescribe elementos en un array
con los valores de la colección Colección, comenzando en la posición
Posición.
Colecciones
Sub Main()
Dim alDatos As New ArrayList(10)
alDatos.Add("a")
alDatos.AddRange(New String() {"b", "c", "d"})
Console.WriteLine("ArrayList después de usar Add() y AddRange()")
RecorrerAList(alDatos)
alDatos.Insert(2, "hola")
Console.WriteLine("ArrayList después de usar Insert()")
RecorrerAList(alDatos)
alDatos.InsertRange(1, New Integer() {55, 77, 88})
Console.WriteLine("ArrayList después de usar InsertRange()")
RecorrerAList(alDatos)
alDatos.SetRange(3, New String() {"zzz", "yyy"})
Console.WriteLine("ArrayList después de usar SetRange()")
RecorrerAList(alDatos)
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
Colecciones
Recorrer y obtener valores de un ArrayList
Para recorrer un array podemos emplear la técnica habitual del
bucle For...Next y la propiedad Count del objeto ArrayList, que
devuelve el número de elementos que tiene el objeto; o bien
podemos usar un objeto del interfaz IEnumerator, proporcionado
por el método GetEnumerator( ), mucho más simple de recorrer.

For iContador = 0 To (alLetras.Count - 1)


Console.WriteLine("Elemento actual {0}, valor: {1}", _
iContador, alLetras(iContador))
Next
Colecciones
recorrer el array con un enumerador
Console.WriteLine("Recorrer objeto ArrayList con un
enumerador")
Dim oEnumerador As IEnumerator
oEnumerador = alLetras.GetEnumerator()
While oEnumerador.MoveNext()
Console.WriteLine("Elemento de la lista: {0}",
oEnumerador.Current())
End While
Console.ReadLine()
Colecciones
Capacidad y valores en una colección ArrayList
La capacidad de un ArrayList hace referencia al número de
elementos del array subyacente que contiene este objeto,
mientras que los valores asignados se refieren a aquellos
elementos del array los que se ha asignado valor mediante
métodos como Add( ) o AddRange( ). Podemos obtener esta
información a través de las propiedades Capacity y Count del
objeto colección.
myAL.Count
myAL.Capacity

Console.WriteLine("Valores asignados al array: {0}", alLetras.Count)


Console.WriteLine("Capacidad del array: {0}", alLetras.Capacity)
Colecciones
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.
Dim ab() As Object = arreglos.GetRange(1, 3).ToArray
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. Dim arr2 As ArrayList = ArrayList.FixedSize(myArrayList)
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.
Dim myAL As ArrayList = ArrayList.Repeat(Nothing, 5)
Colecciones
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.
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.
Dim myReadOnlyAL As ArrayList = ArrayList.ReadOnly(myAL)
Colecciones
Obtención de subarrays a partir de un objeto ArrayList

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
Colecciones
Búsquedas en colecciones ArrayList
Dim alLetras As New ArrayList(10)
alLetras.AddRange(New String() {"jj", "oo", "aa", _
"jj", "ee", "tt", "mm", "xx"})
Dim iPosicIndexOf As Integer
' buscar un elemento de la colección desde el principio
iPosicIndexOf = alLetras.IndexOf("aa")
Console.WriteLine("Posición al buscar con IndexOf: {0}", iPosicIndexOf)
Dim iPosicLastIndexOf As Integer
' buscar un elemento de la colección desde el final
iPosicLastIndexOf = alLetras.LastIndexOf("jj")
Console.WriteLine("Posición al buscar con LastIndexOf: {0}", _
iPosicLastIndexOf)
Dim bEncontrado As Boolean
' comprobar si existe un valor en la colección
bEncontrado = alLetras.Contains("oo")
Console.WriteLine("Resultado de la búsqueda con Contains: {0}", bEncontrado)
Console.ReadLine()
Colecciones
Borrado de elementos en una colección ArrayList
Remove(Valor). Elimina el elemento del array que corresponde a
Valor.
myAL.Remove("lazy")
RemoveAt(Posicion). Elimina el elemento del array situado en el
índice Posición.
myAL.RemoveAt(5)
RemoveRange(Posición, Elementos). Elimina el conjunto de
elementos indicados en el parámetro Elementos, comenzando por el
índice Posición.
myAL.RemoveRange(4, 3)
Clear( ). Elimina todos los elementos del objeto.
myAL.Clear()
Colecciones
Borrado de elementos en una colección ArrayList
' borra todos los elementos
alLetras1.AddRange(New String() {"a", "b", "c", "d", "e", "f", "g"})
alLetras1.Clear()

' borra un elemento por el valor


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

' borra un elemento por posición


Dim alLetras3 As New ArrayList(10)
alLetras3.AddRange(New String() {"a", "b", "c", "d", "e", "f", "g"})
alLetras3.RemoveAt(5)
Colecciones
Borrado de elementos en una colección ArrayList
' borra un rango de elementos por posición
Dim alLetras4 As New ArrayList(10)
alLetras4.AddRange(New String() {"a", "b", "c", "d", "e", "f", "g"})
alLetras4.RemoveRange(2, 3)

' reajustar capacidad del array


alLetras4.TrimToSize()
Colecciones
Ordenar elementos en un objeto ArrayList
Al igual que en la clase base Array, los objetos ArrayList disponen del
método Sort( ), que ordena los elementos del array; y del método Reverse(
), que invierte las posiciones de un número determinado de elementos del
array.

Dim alLetras As New ArrayList(10)


alLetras.AddRange(New String() {"z", "t", "c", "a", "k", "f", "m"})

' ordenar
alLetras.Sort()
Console.WriteLine("ArrayList después de ordenar")
RecorrerAList(alLetras)

' invertir posiciones de elementos


alLetras.Reverse(3, 3)
Console.WriteLine("ArrayList después de invertir elementos")
RecorrerAList(alLetras)
Console.ReadLine()
Colecciones
Ordenar elementos en un objeto ArrayList
Al igual que en la clase base Array, los objetos ArrayList disponen del
método Sort( ), que ordena los elementos del array; y del método Reverse(
), que invierte las posiciones de un número determinado de elementos del
array.

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
Procesar unidades, directorios y archivos
Se puede usar Visual Basic para procesar unidades, carpetas y
archivos con el objeto My.Computer.FileSystem, que proporciona un
mejor rendimiento y es más fácil de usar que los métodos
tradicionales como las funciones FileOpen y Write (aunque siguen
estando disponibles).
Clase Directory
Expone métodos estáticos para crear, mover y enumerar
archivos en directorios y subdirectorios. Esta clase no
puede heredarse.
Clase Directory
Expone métodos estáticos para crear, mover y enumerar archivos en
directorios y subdirectorios. Esta clase no puede heredarse.

Mas info: https://msdn.microsoft.com/es-


es/library/system.io.directory(v=vs.110).aspx
Clase File
Proporciona métodos estáticos para crear, copiar,
eliminar, mover y abrir un solo archivo, y contribuye a la
creación de objetos FileStream.
Mas info: https://msdn.microsoft.com/es-
es/library/system.io.file(v=vs.110).aspx
Rúbrica de evaluación
0 4 7 10
Dominio de Responde a
Responde todos
conceptos explica la mayoría
No los domina los conceptos
algunos de
adecuadamente
conceptos

Realiza los
ejercicios Realiza Realiza la Realiza el
practico en No los realiza menos de la mayor parte ejercicio
el aula mitad del ejercicio completo
60%
¡Gracias!

S-ar putea să vă placă și