realbasic-nug
[Top] [All Lists]

Re: How do you sort Object arrays?

To: REALbasic NUG <realbasic-nug at lists dot realsoftware dot com>
Subject: Re: How do you sort Object arrays?
From: Phil M <phil at mobleybros dot com>
Date: Sat, 30 Sep 2006 08:12:33 -0700
Delivered-to: listarchive at realsoftware dot com
Delivered-to: realbasic-nug at lists dot realsoftware dot com
References: <20060930060602 dot 38D15153EDE4 at lists dot realsoftware dot com> <6F73476F-D62B-405A-8101-EE5D0852B543 at elfdata dot com> <451E7569 dot 4070106 at ntlworld dot com>
On Sep 30, 2006, at 6:47 AM, Fred of Occam wrote:

The array of objects must itself be an object, or part of one.

Actually, I have it working without a wrapper object. I posted this technique earlier, but I provide a little more detail here. See below:

Create a method of that object which performs a sort on the array, using some sorting key. Swap sort is the simplest, just comparing adjacent items and swapping them if required. It is of complexity N squared, so if your list is very long something like quick sort might be better.

Both of these need little extra memory.

If the object has any events, one of these could be used to call the sort when required. More likely you will have to call the sort externally whenever you read or write to the array of objects.

I could have used Charles SortLibrary or I could have tried to create my own (and much slower) sorting algorithm. What I ended up doing was taking advantage of the "new" SortWith() method (I think this was introduced in REALbasic 2005r1).

The built-in Sort() and SortWith() only works with Double(), Integer (), Single() and String(). If your object has one of these properties, then you can implement a sort function based on its value. In order to get the sort to work, I have loop through all of the Objects and retrieve its value into a new temporary array. The only real problem with this is how to handle Objects which are Nil; and in my original technique I just ignored them. I decided this was not the "correct" thing to do and will append Nil objects to the end of the array after the sort so that the size of the array does not change.

For this example, class Foo has three properties:

    Class Foo Properties:
      Name As String
      ID As Integer
      Percentage As Double

So to allow Foo() arrays to be sorted by all three properties, I have to implement three different methods, and I have to put them either in another class or in a module. I choose to put them into a Module and use the Extends keyword to make it appear more like the built-in Sort() and SortWith() methods.

  Sub SortByName(Extends f() As Foo)
    Dim v() As String
    Dim k, nilCount As Integer
    Do Until (k > UBound(f))
      If (f(k) Is Nil) Then
        f.Remove(k)
        nilCount = nilCount + 1
      Else
        v.Append(f(k).Name)     // get the property value here
        k = k + 1
      End If
    Loop
    v.SortWith(f)      // here REALbasic does the sort for me
    For k = 1 To nilCount      // add back Nil objects
      f.Append(Nil)
    Next
  End Sub

The other sort methods are a straight copy except the type for v() and the property access. If you only want to provide a sort on a single property, you can just name the method Sort().

_______________________________________________
Unsubscribe or switch delivery mode:
<http://www.realsoftware.com/support/listmanager/>

Search the archives of this list here:
<http://support.realsoftware.com/listarchives/lists.html>


<Prev in Thread] Current Thread [Next in Thread>