En este artículo se proporciona información acerca de la
colección HashTable. Puesto que las operaciones hash eliminan la necesidad de
realizar costosas búsquedas para recuperar datos, permiten realizar dicha
acción de forma eficiente. Las operaciones hash usan el valor de la propia
clave para localizar los datos.
Base Class Libraries ofrece una clase
HashTable que se define en el espacio de nombres
System.Collections de modo que no tenga que codificar sus propias tablas
hash.
Pasos para generar el ejemplo
Una colección HashTable almacena un par
(clave, valor) y usa la
clave para realizar la operación hash y obtener la ubicación de
almacenamiento. La
clave es inmutable y no puede tener entradas duplicadas en la colección
HashTable. En este ejemplo se usan varias instancias de una única clase
Person para almacenarse en una
HashTable. El apellido se usa como
clave.
- Abra Microsoft Visual Studio .NET o Microsoft Visual Studio
2005, y cree un proyecto de aplicación de Windows en Visual Basic .NET o Visual
Basic 2005. Form1 se agrega al proyecto de forma predeterminada.
- En el Explorador de soluciones, haga clic con el botón
secundario del mouse en el nombre del proyecto, seleccione Agregar y haga clic en Agregar clase para agregar un módulo Class. Class1 se agrega al proyecto de forma predeterminada.
- En el cuadro de diálogo Agregar nuevo elemento, haga clic en Abrir.
Nota: en Visual Studio 2005, haga clic en Agregar en
lugar de en Abrir. - Reemplace el código del módulo Class1 con el siguiente:
Public Class Person Public Fname, Lname As String
Sub New(ByVal FirstName As String, ByVal LastName As String) Fname = FirstName Lname = LastName End Sub
Public Overrides Function ToString() As String Return Fname + " " + Lname End Function End Class
La clase Person tiene un constructor que acepta los parámetros FirstName y LastName, y asigna estos parámetros a las variables locales. La función ToString invalida a ToString de la clase Object para devolver Fname y Lname concatenados. - En Form1.vb, agregue la instrucción Imports siguiente al principio del módulo de código:
Imports System.Collections
- Crea un objeto Hashtable de nivel de formulario y declare tres variables de tipo Person. Agregue el código siguiente a la clase Form1:
Dim MyTable As New Hashtable()
'Por simplicidad, se crean tres objetos Person para agregar a la colección HashTable.
Dim Person1, Person2, Person3 As Person
- En los pasos siguientes, use el método Add del objeto Hashtable para agregar tres objetos Person al objeto Hashtable en un bloque try-catch. El bloque try-catch captura la excepción y muestra un mensaje si existen claves
duplicadas.
- Coloque un control Button en Form1 y cambie la propiedad Text por Agregar elementos.
- Haga doble clic en el botón para abrir su ventana
Código y pegue el código siguiente en el evento Button1_Click:
Person1 = New Person("Karen", "Berge") Person2 = New Person("David", "Campbell") Person3 = New Person("Jim", "Kim")
'El método Add acepta la clave como primer parámetro y el valor como segundo.
Try MyTable.Add(Person1.Lname, Person1) MyTable.Add(Person2.Lname, Person2) MyTable.Add(Person3.Lname, Person3) Catch ae As ArgumentException MessageBox.Show("Clave duplicada") End Try
- El objeto Hashtable proporciona un indizador. En los pasos siguientes se usa la clave como índice para tener acceso al valor que se almacena en la
ubicación de hash.
- Agregue un control Button en Form1 y cambie la propiedad Text por Obtener elementos.
- Haga doble clic en el botón y pegue el código siguiente
en el eventoButton2_Click:
'Use el indicador de la clase Hashtable para recuperar los objetos. El indicador acepta la 'clave como parámetro y tiene acceso a ella con la ubicación de hash.
Try MessageBox.Show(MyTable(Person1.Lname).ToString) MessageBox.Show(MyTable(Person2.Lname).ToString) MessageBox.Show(MyTable(Person3.Lname).ToString) Catch ex As NullReferenceException MessageBox.Show("La clave no está en Hashtable") End Try
- En los pasos siguientes, use el método Remove para quitar un único elemento de la colección HashTable:
- Agregue un control Button en Form1 y cambie la propiedad Text por Quitar elemento.
- Haga doble clic en el botón y pegue el código siguiente
en el evento Button3_Click:
'Usar la propiedad Count. If (MyTable.Count = 0) Then MessageBox.Show("No hay elementos en HashTable") Else MessageBox.Show("El recuento antes de quitar un elemento es" & " " & MyTable.Count) MessageBox.Show("Quitando el valor almacenado en el valor de la clave (Berge)") 'Quitar el objeto que se almacena en el valor de la clave Person1.Lname. MyTable.Remove(Person1.Lname) End If
- En los pasos siguientes se enumeran los elementos que se
almacenan en la colección HashTable.
- Agregue un control Button en Form1 y cambie la propiedad Text por Enumerar.
- Haga doble clic en el botón y pegue el código siguiente
en el evento Button4_Click:
Dim Enumerator As IDictionaryEnumerator Enumerator = MyTable.GetEnumerator()
If (MyTable.Count = 0) Then MessageBox.Show("HashTable está vacía") Else MessageBox.Show("Enumerando la colección HashTable") While Enumerator.MoveNext() MessageBox.Show(Enumerator.Value.ToString()) End While End If
Dim MyKeys As ICollection Dim Key As Object
If (MyTable.Count = 0) Then MessageBox.Show("HashTable está vacía") Else MessageBox.Show("Teniendo acceso a la propiedad keys para devolver la colección keys") MyKeys = MyTable.Keys()
For Each Key In MyKeys MessageBox.Show(Key.ToString) Next End If
En este código se declara una variable de tipo IDictionaryEnumerator y se llama al método GetEnumerator de la colección HashTable. Con el Enumerator devuelto, el código enumera los elementos de la colección y usa
el método Keys de HashTable para enumerar las claves.
- En los pasos siguientes, use el método Clear para borrar la HashTable.
- Agregue un control Button en Form1 y cambie la propiedad Text por Borrar.
- Haga doble clic en el botón y pegue el código siguiente
en el evento Button5_Click:
MyTable.Clear() MessageBox.Show("HashTable está vacía ahora")
- Siga estos pasos para generar y ejecutar la aplicación:
- Haga clic en Agregar elementos. Observe que los tres objetos Person se agregan a la colección HashTable.
- Haga clic en Obtener elementos. Observe que el indizador obtiene los elementos de la colección
HashTable. Se muestran los tres elementos recién agregados.
- Haga clic en Quitar elemento. Observe que se elimina el elemento que hay en la ubicación de la
clave "Berge".
- Haga clic en Enumerar. Observe que IDictionaryEnumerator enumera los elementos de la colección HashTable.
- Haga clic en Borrar. Observe que todos los elementos se borran de la colección
HashTable.
NOTA: los nombres de ejemplo de compañías, organizaciones, productos,
nombres de dominio, direcciones de correo electrónico, logotipos, personas,
lugares y acontecimientos aquí descritos son ficticios. No se pretende indicar
ni debe deducirse ninguna asociación con compañías, organizaciones, productos,
nombres de dominio, direcciones de correo electrónico, logotipos, personas,
lugares o acontecimientos reales.