Sorting Arrays

Bob Sneidar bobsneidar at iotecdigital.com
Thu Aug 10 16:08:09 EDT 2023


Thanks Alex, not sure how I missed that. I was only testing for a specific use case and only tried numeric descending. 

Bob S


> On Aug 10, 2023, at 12:29 PM, Alex Tweedly via use-livecode <use-livecode at lists.runrev.com> wrote:
> 
> 
> On 09/08/2023 00:15, Bob Sneidar via use-livecode wrote:
>> Has anyone come across a need to sort a numbered array by the values of the different keys? Here you go.
> 
> Absolutely I have needed that quite often now. I tend to use sequences (numbered arrays) often - maybe too often.
> 
> Up until now I've just done the sorting in the "traditional" way (i.e. using multiple "sort" commands), like
> 
>>    put seqAsLines(sQ2) into tKeys
>>    sort lines of tKeys numeric by sQ2[each]["anumber"]
>>    sort lines of tKeys by sQ2[each]["thecategory"]
>>    rebuildSeq sQ2, tKeys
> (the functions seqAsLines and rebuildSeq are included in the code snippet below).
> 
> But I really like your idea of having a handler that can be given multiple sort keys, and just does it all, so I took a detailed look.
> 
> First - a couple of little bugs for you.
> 
>> Keep in mind that there is no error checking so I have no idea what would happen if you provided a sort key that didn’t exist in the array.
>> 
>> on sortNumberedArray @pArrayDataA, pSortKeys
>>          switch
>>             case tKeyWord is among the items of "asc,ascending,desc,descending"
>>                put tKeyWord into tSortKeysA [i] ["sortorder"]
>>                break
>>             case tKeyWord is "International,Numeric,datetime,text,binary"
> 'is' should be 'is among the items of'
>>                put tKeyWord into tSortKeysA [i] ["sorttype"]
>>                break
>>             default
>>                put word 1 to x of tSortIndex into tSortKeysA [i] ["sortvalue"]
>>          end switch
>>       end repeat
>>    end repeat
>>    
> 
> Secondly, not sure if it's a bug or simply a limitation - the code fails if one of the array keys to use for sorting is one of "asc,desc,numeric,...".
> 
> 
> And - overall, an alternate suggestion. I think your way is a bot complex.
> Combining my "traditional" way as above, and your example, I came up with a  simpler way to do the same thing:
> 
>> on simpleSortNumberedArray @pArrayDataA, pSortKeys
>>    local tKeys, tSeq, tOneSortKey, tSortCommand
>>    put seqAsLines(pArrayDataA) into tKeys
>>    repeat with I = the number of items in pSortKeys down to 1
>>       put item I of pSortKeys into tOneSortKey
>>       put "sort lines of tKeys" && word 2 to -1 of tOneSortKey && \
>>             "by pArrayData[each][" && word 1 of tOneSortKey && "]" into tSortCommand
>>       do tSortCommand
>>    end repeat
>>    rebuildSeq pArrayDataA, tKeys
>> end simpleSortNumberedArray
>> 
>> function seqAsLines pSeq
>>    local tRes
>>    repeat with i = 1 to the number of elements in pSeq
>>       put i & CR after tRes
>>    end repeat
>>    return tRes
>> end seqAsLines
>> 
>> command rebuildSeq @pSeq, pList
>>    local tResQ, tCount
>>    repeat for each line L in pList
>>       add 1 to tCount
>>       put pSeq[L] into tResQ[tCount]
>>    end repeat
>>    put tResQ into pSeq
>> end rebuildSeq
> This is simpler and, I think, easier to understand. And it's certainly much faster: takes 89 msec for my test case rather than 3416 msecs.
> 
> Alex.
> 
> 
> 
> _______________________________________________
> use-livecode mailing list
> use-livecode at lists.runrev.com
> Please visit this url to subscribe, unsubscribe and manage your subscription preferences:
> http://lists.runrev.com/mailman/listinfo/use-livecode



More information about the use-livecode mailing list