Sorting Arrays
Alex Tweedly
alex at tweedly.net
Fri Aug 11 19:58:59 EDT 2023
On 11/08/2023 23:00, J. Landman Gay via use-livecode wrote:
> On 8/10/23 2:29 PM, Alex Tweedly via use-livecode wrote:
> [ ... code from earlier posting ...]
> I couldn't get this to work until I altered it, but I was using a very
> simple array. What type of array data did you use? I think I'm missing
> something.
>
> I just did this:
>
> put the weekdayNames into tDataA
> split tDataA by cr
> simpleSortNumberedArray tDataA, "descending,text"
>
What you're missing is that this (simpleSortNumberedArray) is only
intended for "numbered array"s (which LC is calling "sequences" in some
places); i.e. an array where the (top-level) keys are all consecutive
integers, from 1 .... n
Also, the pSortkeys should be a number of comma-separated items, each of
which consists of a key by which you want to sort the array followed
optionally by an order and type.
So you might do something like :
> on mouseup
> local tCounter, tDataA
>
> repeat for each line L in the weekdayNames
> add 1 to tCounter
> put L into tDataA[tCounter]["dayname"]
> put the number of chars in L into tDataA[tCounter]["charcount"]
> end repeat
>
> -- sorts ascending by name (i.e. F, M, Sa, Su, Th, Tu, W)
> simpleSortNumberedArray tDataA, "dayname"
> repeat with I = 1 to 7
> put tDataA[I]["charcount"] && tDataA[I]["dayname"] & CR after msg
> end repeat
>
> put "---------" &CR after msg
>
> -- sorts descending numeric by number of characters in name
> -- NB within each char count value, they remain in alphabetical
> order of name
> simpleSortNumberedArray tDataA, "charcount numeric descending"
> repeat with I = 1 to 7
> put tDataA[I]["charcount"] && tDataA[I]["dayname"] & CR after msg
> end repeat
> end mouseup
and get as output
> 6 Friday
> 6 Monday
> 8 Saturday
> 6 Sunday
> 8 Thursday
> 7 Tuesday
> 9 Wednesday
> ---------
> 9 Wednesday
> 8 Saturday
> 8 Thursday
> 7 Tuesday
> 6 Friday
> 6 Monday
> 6 Sunday
So - it would be worth adding a check that the array passed in is indeed
a sequence, at the start of simpleSortNumberedArray:
if NOT (pArrayDataA is an array AND \
item 2 of extents(pArrayDataA) is the number of elements in
pArrayDataA) then \
return pArrayData
I'm now going to add this to my personal library, but I'll rename it to
seqSortMultipleKeys
Alex.
More information about the use-livecode
mailing list