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@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@lists.runrev.com > Please visit this url to subscribe, unsubscribe and manage your subscription > preferences: > http://lists.runrev.com/mailman/listinfo/use-livecode _______________________________________________ use-livecode mailing list use-livecode@lists.runrev.com Please visit this url to subscribe, unsubscribe and manage your subscription preferences: http://lists.runrev.com/mailman/listinfo/use-livecode