Después de unos días de mucho volumen de trabajo que me ha mantenido algo alejado del blog, aquí pongo la tercera parte de este post sobre ArrayList en VisualBasic.NET. En la primera estuve hablando de que para que el método BinarySearch o Sort puedan funcionar adecuadamente se necesita que los objetos que llenan el ArrayList se puedan comparar. Comenté también que había dos maneras de hacer esto: mediante una clase externa que implemente un IComparer o haciendo que la clase en cuestión implemente IComparable. En la segunda parte mostré el sistema de hacer que clsPerson (mi clase ejemplo) implemente IComparable. En esta tercera parte muestro el sistema de utilizar una clase externa que implemente IComparer.
Para ello la clase clsPerson de ejemplo quedará esta vez así:
' Author: Albert Mata (www.albertmata.net)
' Date: 20080702
' Description: Class to show how to work with ArrayList.
'--------------------------------------------------------------------
Public Class clsPerson
'----------------------------------------------------------------
' Attributes.
'----------------------------------------------------------------
Public Name As String
Public Age As Integer
'----------------------------------------------------------------
' Constructor method.
'----------------------------------------------------------------
Public Sub New(ByVal Name As String, ByVal Age As Integer)
Me.Name = Name
Me.Age = Age
End Sub
End Class
O sea, extremadamente simple, sin rastro del IComparable que utilizamos en el post anterior. Pero ahora necesitaremos una clase más que actuará de comparador y que tendrá el siguiente código:
' Author: Albert Mata (www.albertmata.net)
' Date: 20080702
' Description: Class to compare clsPerson objects by name.
'--------------------------------------------------------------------
Public Class clsPersonComparatorByName
Implements IComparer
'----------------------------------------------------------------
' Method to compare two clsPerson objects.
'----------------------------------------------------------------
Public Function Compare(ByVal x As Object, ByVal y As Object) _
As Integer Implements IComparer.Compare
'Converting received objects to clsPerson type.
Dim Object1 As clsPerson = CType(x, clsPerson)
Dim Object2 As clsPerson = CType(y, clsPerson)
'Criterium to be used to compare.
Dim Result As Integer
If (Object1.Name < Object2.Name) Then
Result = -1
ElseIf (Object1.Name > Object2.Name) Then
Result = 1
Else
Result = 0
End If
'Returning result.
Return Result
End Function
End Class
Una vez implementadas estas dos clases, podemos crearnos un ArrayList, llenarlo de objetos clsPerson y ordenarlo para posteriormente mostrar los resultados. No obstante podemos tener más de una clase comparadora para así poder comparar en cada caso utilizando criterios distintos. Por ejemplo yo he creado una clase que compara dos objetos clsPerson según el nombre, pero puedo hacer lo mismo comparándolos según la edad:
' Author: Albert Mata (www.albertmata.net)
' Date: 20080702
' Description: Class to compare clsPerson objects by age.
'--------------------------------------------------------------------
Public Class clsPersonComparatorByAge
Implements IComparer
'----------------------------------------------------------------
' Method to compare two clsPerson objects.
'----------------------------------------------------------------
Public Function Compare(ByVal x As Object, ByVal y As Object) _
As Integer Implements IComparer.Compare
'Converting received objects to clsPerson.
Dim Object1 As clsPerson = CType(x, clsPerson)
Dim Object2 As clsPerson = CType(y, clsPerson)
'Criterium to be used to compare.
Dim Result As Integer
If (Object1.Age < Object2.Age) Then
Result = -1
ElseIf (Object1.Age > Object2.Age) Then
Result = 1
Else
Result = 0
End If
'Returning result.
Return Result
End Function
End Class
Y finalmente podemos comprobar el funcionamiento de todo ello con el siguiente código:
Dim People As New ArrayList()
People.Add(New clsPerson("Albert", 29))
People.Add(New clsPerson("Morgan", 32))
People.Add(New clsPerson("Lucas", 35))
People.Add(New clsPerson("Steven", 39))
People.Add(New clsPerson("Zoe", 17))
'Showing ArrayList's elements before sorting.
Debug.Print("-------- Before sorting ---------")
Dim IT As IEnumerator = People.GetEnumerator
Dim Person As clsPerson
While IT.MoveNext
Person = IT.Current
Debug.Print(Person.Name & " - " & Person.Age)
End While
'Sorting ArrayList by name.
People.Sort(New clsPersonComparatorByName())
'Showing ArrayList's elements after sorting by name.
Debug.Print("----- After sorting by name -----")
IT = People.GetEnumerator
While IT.MoveNext
Person = IT.Current
Debug.Print(Person.Name & " - " & Person.Age)
End While
'Sorting ArrayList by age.
People.Sort(New clsPersonComparatorByAge())
'Showing ArrayList's elements after sorting by age.
Debug.Print("----- After sorting by age ------")
IT = People.GetEnumerator
While IT.MoveNext
Person = IT.Current
Debug.Print(Person.Name & " - " & Person.Age)
End While
Que nos devuelve un resultado en la ventana Inmediato (CTRL+G para visualizarla) como el que sigue:
Albert - 29
Morgan - 32
Lucas - 35
Steven - 39
Zoe - 17
----- After sorting by name -----
Albert - 29
Lucas - 35
Morgan - 32
Steven - 39
Zoe - 17
----- After sorting by age ------
Zoe - 17
Albert - 29
Morgan - 32
Lucas - 35
Steven - 39
O sea, exactamente lo que pretendíamos. Quedan pues vistos los dos sistemas para hacer que una clase sea comparable. ![]()
En el
¿Quién no hizo sus primeros pinitos en su día con simples arrays -o matrices o vectores- gozando de esa manera ordenada de acumular valores? Primero los unidimensionales… después sufriendo un poquito más con los multidimensionales… ¡qué tiempos! Ahora VisualStudio.NET (
Últimos comentarios
RSS