learn | unlearn | relearn

In Xojo it is easy to sort one-dimensional arrays. You just write: yourArray.Sort and you are done.

Things are getting a little bit more complicated, if you have to sort so-called multidimensional arrays, means an array with multiple values. Out-of-the-box Xojo can’t sort these arrays.

But with a simple re-design of your application it is relatively easy to get this achieved. You can store your values in an own class, and the instances of that class in an one-dimensional array.

Now Xojo can’t sort this one-dimensional array either, because it contains classes and not strings for instance, but you can write an own method to sort your array, as I will show below.

You can download the above dummy project here:

Jeannot-Muller/Xojo_Sort_Multidimensional_Array
Sorting an multidimensional array in Xojo. Contribute to Jeannot-Muller/Xojo_Sort_Multidimensional_Array development by creating an account on GitHub.

The main code is straight forward:

// Defining a single dimensioned array, which will contain all our cars
var results() as vehicle

// Creating 6 cars (with drivers)
// the id is only for information purposes
for x as integer = 0 to 5
  var result as new vehicle
  result.id = x
  select case x
  case 0
    result.driver = "Marcel"
    result.car = "Mercedes"
  case 1
    result.driver = "Jeannot"
    result.car = "Hyundai"
  case 2
    result.driver = "Anton"
    result.car = "Alfa Romeo"
  case 3
    result.driver = "Silke"
    result.car = "Toyota"
  case 4
    result.driver = "Xavier"
    result.car = "Citroen"
  case 5
    result.driver = "Pluto"
    result.car = "Porsche"
  end select
  results.AddRow(result)
next x

var output as string

// Show the created cars by exporting them through
// looping over our array
output = "RESULTS w/o SORTING:" + endofline + endofline

For each result as vehicle in results
  output = output + result.driver + " | " + result.car + EndOfLine
next
output = output + endofline

// You can't sort "classes" in an array and you can't reference to
// properties of the classes in this array, but you can create your own
// method for sorting and reference to this method
// Please note that auto completion will not work in the IDE for this sort kind
// of sort statement. Even the word "sort" will not be shown as the Xojo IDE knows that
// an array can not be sorted (out-of-the-box) if it contains classes.
results.sort(addressof vehicleCompareCar )

// Exporting the array again, is now showing that the entries got sorted. 
// Mission accomplished. So in case you have the need of a multidimensional array, it is best
// to transfer the variables into a class and add those classes to a one-dimensional array, 
// which you can sort with your own logic.
output = output + "RESULTS after SORTING:" + endofline + endofline

For each result as vehicle in results
  output = output + result.driver + " | " + result.car + EndOfLine
next

taResults.value = output

Please note that we are writing an own method to sort our one-dimensional array, containing the class instances. This is done via the command:

results.sort(addressof vehicleCompareCar )

VehicleCompareCar is the methodname to do this sorting, which again is straightforward:

var result as integer
result = value1.car.Compare( value2.car, ComparisonOptions.CaseSensitive )
return result

I decided to sort by car type in this example, but of course I could easily sort by whatever other field I’m interested in.

In conclusion: if you are in the need of sorting a multidimensional array with Xojo, it is best to convert it first into class instances which you put into a one-dimensional array.

Comments

Sign in or become a jeannot-muller.com member to join the conversation.
Just enter your email below to get a log in link.



You’ve successfully subscribed to jeannot-muller.com
Welcome back! You’ve successfully signed in.
Great! You’ve successfully signed up.
Your link has expired
Success! Check your email for magic link to sign-in.