Sorting a Two-Dimensional Array in Visual Basic
- Knowledge of Visual Basic
- Visual Studio or equivalent IDE
As a programmer, you will eventually reach the point where you need to sort a two-dimensional array by column while maintaining the integrity of the array. Recently, while trying to write a simple database program intended to parse and sort CSV files, I reached this dilemma. Most forums and support articles said that sorting a 2D array was impossible and should not be attempted.
Not willing to take no for an answer, I developed a simple method in Visual Basic. Even though it's pretty clunky and probably uses way more memory than it should, it gets the job done in a reasonable amount of time.
The implementation of the method can be broken down into a few steps:
- Create two storage arrays, one to store keys and the original indices of those keys
- Pass these arrays to the Array.Sort method, which sorts both arrays to keep the keys even with their indices
- Create a two-dimensional list and use this to sort the two-dimensional array based on keys
- Convert the two-dimensional list to a two-dimensional array and return it
This method can be implemented as follows: (Note: this code was written freehand hasn't been tested yet. It'll be tested soon.)
' Function Sort: Sorts a two-dimensional array by column ' Returns the sorted two-dimensional array ' ' Params: ' arrToSort- The two-dimensional array to sort ' columnToSortBy- The zero-based position of the column to sort by ' opt startSortAt- The zero-based position to sort sorting at Function Sort(ByVal arrToSort()() as Object, ByVal columnToSortBy as Integer, Optional ByVal startSortAt as Integer = 0) ' Check to see if array is zero length If arrToSort.Length = 0 Then Return arrToSort ' Create storage array for keys Dim tempKeys as New List(Of Object) For i = startSortAt To arrToSort.Length - 1 tempKeys.Add(arrToSort(i)(columnToSortBy)) Next Dim keys as Object() = tempKeys.ToArray ' Create storage array for indices ' Dim tempIndices as New List(Of Integer) For i = startSortAt to arrToSort.Length - 1 tempIndices.Add(i) Next Dim indices as Integer() = tempIndices.ToArray ' Sort the storage arrays ' Array.Sort(keys, indices) ' Create temporary two-dimensional list ' Dim tempArrToSort as New List(Of List(Of Object)) ' Check if sort started at index other than 0 ' ' If it did, add the non-sorted entries first ' If Not startSortAt = 0 Then For i = 0 to startSortAt tempArrToSort.Add(arrToSort(i)) Next End If ' Add sorted items ' For i = 0 to keys.Length - 1 tempArrToSort.Add(arrToSort(indices(i))) Next ' Return sorted two-dimensional array ' Return tempArrToSort.ToArray End Function
Using this method is also rather simple. Take, for example, a database contained in memory in a two-dimensional array. The database is contained in db()() and contains these columns:
- Acct #
- Other Info
Let's say that you wanted to sort db()() by column 1, Acct #. To do this, you would use the method like this:
db = Sort(db, 1)
Rather simple. But what if the database contains 1,000,000 entries and entries 0-899999 are already sorted by the customer's name? Then you would call the method like this:
db = Sort(db, 0, 900000)
Questions? Comments? Click here to drop me a line. I'm open to criticism and happy to help you troubleshoot.