Solved

Sort Arraylist of Objects

Posted on 2009-04-03
6
224 Views
Last Modified: 2013-11-08
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
Comment
Question by:Ray Turner
  • 3
  • 3
6 Comments
 
LVL 85

Assisted Solution

by:Mike Tomlinson
Mike Tomlinson earned 500 total points
ID: 24061630
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
 

Author Comment

by:Ray Turner
ID: 24062444
How do sort by fullname and ssn?
0
 
LVL 85

Assisted Solution

by:Mike Tomlinson
Mike Tomlinson earned 500 total points
ID: 24062690
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
DevOps Toolchain Recommendations

Read this Gartner Research Note and discover how your IT organization can automate and optimize DevOps processes using a toolchain architecture.

 

Author Comment

by:Ray Turner
ID: 24063608
One more question.  Is there a way to set the sort order?
0
 
LVL 85

Accepted Solution

by:
Mike Tomlinson earned 500 total points
ID: 24063780
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
 

Author Closing Comment

by:Ray Turner
ID: 31566306
Thanks!!!
0

Featured Post

Is Your Active Directory as Secure as You Think?

More than 75% of all records are compromised because of the loss or theft of a privileged credential. Experts have been exploring Active Directory infrastructure to identify key threats and establish best practices for keeping data safe. Attend this month’s webinar to learn more.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Most everyone who has done any programming in VB6 knows that you can do something in code like Debug.Print MyVar and that when the program runs from the IDE, the value of MyVar will be displayed in the Immediate Window. Less well known is Debug.Asse…
You can of course define an array to hold data that is of a particular type like an array of Strings to hold customer names or an array of Doubles to hold customer sales, but what do you do if you want to coordinate that data? This article describes…
Get people started with the process of using Access VBA to control Outlook using automation, Microsoft Access can control other applications. An example is the ability to programmatically talk to Microsoft Outlook. Using automation, an Access applic…
Get people started with the utilization of class modules. Class modules can be a powerful tool in Microsoft Access. They allow you to create self-contained objects that encapsulate functionality. They can easily hide the complexity of a process from…

930 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

11 Experts available now in Live!

Get 1:1 Help Now