• Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 237
  • Last Modified:

Sort Arraylist of Objects

How do you sort an arraylist of objects?  See attached code.
Please provide an example using Visual Basic.
Implements IComparable
 
      Public Shared AllObjects As New ArrayList
      Public Structure AnObject
         Dim FullName as string
         Dim SSN as string
      End Structure

Open in new window

0
Ray Turner
Asked:
Ray Turner
  • 3
  • 3
3 Solutions
 
Mike TomlinsonMiddle School Assistant TeacherCommented:
One way...

(btw, why are you using an ArrayList if you have .Net 3.x?  Use a List(Of AnObject) instead...you can sort differently too then.)
Public Class Form1
 
    Public Structure AnObject
        Dim FullName As String
        Dim SSN As String
    End Structure
 
    Public Shared AllObjects As New ArrayList
 
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Dim ao As New AnObject
        ao.FullName = "Mickey Mouse"
        ao.SSN = "123456789"
        Form1.AllObjects.Add(ao)
 
        ao = New AnObject
        ao.FullName = "Donald Duck"
        ao.SSN = "987654321"
        Form1.AllObjects.Add(ao)
 
        ao = New AnObject
        ao.FullName = "Zany Zebra"
        ao.SSN = "999999999"
        Form1.AllObjects.Add(ao)
 
        ao = New AnObject
        ao.FullName = "Goofy"
        ao.SSN = "111111111"
        Form1.AllObjects.Add(ao)
    End Sub
 
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim mcc As New MyComparerClass
        Form1.AllObjects.Sort(mcc)
 
        For Each ao As AnObject In Form1.AllObjects
            Debug.Print(ao.FullName & " : " & ao.SSN)
        Next
    End Sub
 
    Private Class MyComparerClass
        Implements IComparer
 
        Public Function Compare(ByVal x As Object, ByVal y As Object) As Integer Implements System.Collections.IComparer.Compare
            If TypeOf x Is AnObject AndAlso TypeOf y Is AnObject Then
                Dim ao1 As AnObject = DirectCast(x, AnObject)
                Dim ao2 As AnObject = DirectCast(y, AnObject)
                ' comparae by FullName for instance:
                Return ao1.FullName.CompareTo(ao2.FullName)
            Else
                Return 0
            End If
        End Function
    End Class
 
End Class

Open in new window

0
 
Ray TurnerSenior ConsultantAuthor Commented:
How do sort by fullname and ssn?
0
 
Mike TomlinsonMiddle School Assistant TeacherCommented:
You have to first check if the names are equal...and if so, instead perform the comparison on SSN.  If you really have .Net 3.X then you can sort using LINQ instead...

But here it is old-school:
Private Class MyComparerClass
        Implements IComparer
 
        Public Function Compare(ByVal x As Object, ByVal y As Object) As Integer Implements System.Collections.IComparer.Compare
            If TypeOf x Is AnObject AndAlso TypeOf y Is AnObject Then
                Dim ao1 As AnObject = DirectCast(x, AnObject)
                Dim ao2 As AnObject = DirectCast(y, AnObject)
                ' comparae by FullName for instance:
                Dim res As Integer = ao1.FullName.CompareTo(ao2.FullName)
                If res = 0 Then
                    res = ao1.SSN.CompareTo(ao2.SSN)               
                End If
                Return res
            Else
                Return 0
            End If
        End Function
    End Class

Open in new window

0
Cloud Class® Course: Certified Penetration Testing

This CPTE Certified Penetration Testing Engineer course covers everything you need to know about becoming a Certified Penetration Testing Engineer. Career Path: Professional roles include Ethical Hackers, Security Consultants, System Administrators, and Chief Security Officers.

 
Ray TurnerSenior ConsultantAuthor Commented:
One more question.  Is there a way to set the sort order?
0
 
Mike TomlinsonMiddle School Assistant TeacherCommented:
Sure...set up a boolean flag in MyComparerClass to indicate ascending/descending sort order.  If we are sorting descending then we just swap "ao1" and "ao2" so the order is reversed:
Public Class Form1
 
    Public Structure AnObject
        Dim FullName As String
        Dim SSN As String
    End Structure
 
    Public Shared AllObjects As New ArrayList
 
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Dim ao As New AnObject
        ao.FullName = "Mickey Mouse"
        ao.SSN = "123456789"
        Form1.AllObjects.Add(ao)
 
        ao = New AnObject
        ao.FullName = "Donald Duck"
        ao.SSN = "987654321"
        Form1.AllObjects.Add(ao)
 
        ao = New AnObject
        ao.FullName = "Zany Zebra"
        ao.SSN = "999999999"
        Form1.AllObjects.Add(ao)
 
        ao = New AnObject
        ao.FullName = "Goofy"
        ao.SSN = "111111111"
        Form1.AllObjects.Add(ao)
 
        ao = New AnObject
        ao.FullName = "Goofy"
        ao.SSN = "999999999"
        Form1.AllObjects.Add(ao)
 
        ao = New AnObject
        ao.FullName = "Goofy"
        ao.SSN = "555555555"
        Form1.AllObjects.Add(ao)
    End Sub
 
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim mcc As New MyComparerClass
        mcc.SortAscending = False
        Form1.AllObjects.Sort(mcc)
 
        For Each ao As AnObject In Form1.AllObjects
            Debug.Print(ao.FullName & " : " & ao.SSN)
        Next
    End Sub
 
    Private Class MyComparerClass
        Implements IComparer
 
        Public SortAscending As Boolean = True
 
        Public Function Compare(ByVal x As Object, ByVal y As Object) As Integer Implements System.Collections.IComparer.Compare
            If TypeOf x Is AnObject AndAlso TypeOf y Is AnObject Then
                Dim ao1 As AnObject = DirectCast(x, AnObject)
                Dim ao2 As AnObject = DirectCast(y, AnObject)
 
                If Not SortAscending Then
                    ' swap the objects
                    Dim tmp As AnObject = ao1
                    ao1 = ao2
                    ao2 = tmp
                End If
 
                ' comparae by FullName for instance:
                Dim res As Integer = ao1.FullName.CompareTo(ao2.FullName)
                If res = 0 Then
                    res = ao1.SSN.CompareTo(ao2.SSN)
                End If
                Return res
            Else
                Return 0
            End If
        End Function
 
    End Class
 
End Class

Open in new window

0
 
Ray TurnerSenior ConsultantAuthor Commented:
Thanks!!!
0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

Join & Write a Comment

Featured Post

The 14th Annual Expert Award Winners

The results are in! Meet the top members of our 2017 Expert Awards. Congratulations to all who qualified!

  • 3
  • 3
Tackle projects and never again get stuck behind a technical roadblock.
Join Now