Sorting a Type

BlitzMax Forums/BlitzMax Beginners Area/Sorting a Type

Dubious Drewski(Posted 2005) [#1]
Say I have an array of Types, ie:



Type blahType      'define the class
   Field x, y
EndType

Local array:blahType[21]    'set array memory

For Local a = 0 To 20           'initialize slots
  array[a] = New blahType
  array[a].x = Rand(100)	
  array[a].y = Rand(100)
  Print array[a].x+" "+array[a].y  'print what we've got
Next

array.sort    'sort damn you!  (Of course this is too vague)

Print
For a = 0 To 20                    'show results
	Print array[a].x+" "+array[a].y
Next




As you can see if you run this, Array.sort doesn't seem to
sort Types at all when I address the type so vaguely.
How would I go about sorting an array of Types by one
of their internal values?

Say I want to sort the array by the value of Array[].x

[edit] I should mention, I'm trying to get arrays to work
before I go with a List because I'm using this to sort the z
positions of sprites in a graphic engine. I need speed!


Koriolis(Posted 2005) [#2]
BlitzMax won't magically guess how you want to sort it. When sorting objects, it relies on the 'Compare' method to be able to give the relative order of 2 objects. You need to define this method.Something like:
Type blahType      'define the class
   Field x, y

    Method Compare%(other:Object)
        Local t:blahType = blahType(other)
        If t = Null Then
           ' Not of the right type, fallback on default comparison
            Return Super.Compare(other)
        Else
            ' OK, let's compare them, first base on x, then y
            Local diff% = x - t.x
           If x = 0 Then
                diff = y - t.y
           EndIf
           Return diff
        EndIf
    End Method
EndType



Dubious Drewski(Posted 2005) [#3]
Ok, I understand. That would definately work, but now I
would have to write a quicksort algorithm myself, huh.

*deep breath*

Oh boy.


Koriolis(Posted 2005) [#4]
Why so?
'Compare' is a method that the built-in sorting will call, it's that you need to define.


WendellM(Posted 2005) [#5]
Handy. The way that Compare works with Sort is kinda obscure in the docs; thanks for making it clear, Koriolis:



Unsorted:
42
22
70
15
58
18
77
37
46
59
Sorted:
15
18
22
37
42
46
58
59
70
77




Dubious Drewski(Posted 2005) [#6]
Well this is great news! Thanks guys.