Code: Select all
Macro SubSortStructuredArray(Arr, MainField, SubOptions, SubOffset, SubType)
Define SubSort_Start, SubSort_I
SubSort_Start = 0
For SubSort_I = 1 To ArraySize(Arr())
If Arr(SubSort_Start)\MainField <> Arr(SubSort_I)\MainField
If SubSort_Start - (SubSort_I - 1) <> 0 ; Performance optimization
; Debug Str(SubSort_Start) + ", " + Str(subsort_i-1)
SortStructuredArray(Arr(), SubOptions, SubOffset, SubType, SubSort_Start, SubSort_I-1)
EndIf
SubSort_Start = SubSort_I
EndIf
Next
; Debug Str(SubSort_Start) + ", " + Str(subsort_i-1)
SortStructuredArray(Arr(), SubOptions, SubOffset, SubType, SubSort_Start, SubSort_I-1)
EndMacro
;-{ TEST
Macro DebugIt(arStruc, nPts, hdr="", tw=4)
Debug hdr
Debug LSet("--", tw) + LSet("--", tw) + LSet("--", tw)
For i = 0 To nPts-1
Debug LSet(Str(arstruc(i)\a), tw) + LSet(arstruc(i)\b$, tw) + LSet(arstruc(i)\c$, tw)
Next
EndMacro
Structure myABC
a.i
b$
c$
EndStructure
Define.i i, nPts, tw = 4
Define.s r$
Restore SortThis
Read.i nPts
Dim myL.myABC(nPts-1)
For i = 0 To nPts-1
Read.s r$: myL(i)\a = Val(r$)
Read.s myL(i)\b$
Read.s myL(i)\c$
Next
Debug "-- Before Sort --"
DebugIt(myL, nPts, LSet("a", tw) + LSet("b$", tw) + LSet("c$", tw))
; Primary sort on a
SortStructuredArray (myL(), #PB_Sort_Ascending, OffsetOf(myABC\a), #PB_Sort_Integer)
; 2nd sort on b$
SubSortStructuredArray(myL, a, #PB_Sort_Ascending | #PB_Sort_NoCase, OffsetOf(myABC\b$), #PB_Sort_String)
Debug "-- OK After SortBy a+,b$+ --"
DebugIt(myL, nPts, LSet("a", tw) + LSet("b$", tw) + LSet("c$", tw))
Debug "-- FAIL After SortBy a+,b$+,c$+ --"
; Primary sort on a
SortStructuredArray (myL(), #PB_Sort_Ascending, OffsetOf(myABC\a), #PB_Sort_Integer)
; 2nd sort on b$
SubSortStructuredArray(myL, a, #PB_Sort_Ascending | #PB_Sort_NoCase, OffsetOf(myABC\b$), #PB_Sort_String)
; 3rd sort on c$ FAILS since it does not reference Field a
SubSortStructuredArray(myL, b$, #PB_Sort_Ascending | #PB_Sort_NoCase, OffsetOf(myABC\c$), #PB_Sort_String)
DebugIt(myL, nPts, LSet("a", tw) + LSet("b$", tw) + LSet("c$", tw))
DataSection
SortThis:
Data.i 12
; a, b$, c$
Data.s "1", "9", "1"
Data.s "2", "2", "5"
Data.s "3", "1", "b"
Data.s "4", "1", "a"
Data.s "5", "3", "z"
Data.s "7", "3", "y"
Data.s "6", "3", "3"
Data.s "8", "3", "2"
Data.s "9", "3", "x"
Data.s "7", "5", "a" ;<- The problem of a 3rd sort appears when both Field1 and Field2 are duplicates
Data.s "7", "5", "w" ;<- Field1 = primary, Field2 = secondary, etc.
Data.s "7", "4", "x"
IWantThis:
Data.i 12
; a, b$, c$
Data.s "1", "9", "1"
Data.s "2", "2", "5"
Data.s "3", "1", "b"
Data.s "4", "1", "a"
Data.s "5", "3", "z"
Data.s "6", "3", "3"
Data.s "7", "3", "y"
Data.s "7", "4", "x"
Data.s "7", "5", "a" ;<- c$ = a then w
Data.s "7", "5", "w"
Data.s "8", "3", "2"
Data.s "9", "3", "x"
IGetThis:
; -- FAIL After SortBy a+,b$+,c$+ --
; a b$ c$
; -- -- --
; 1 9 1
; 2 2 5
; 4 1 a
; 3 1 b
; 6 3 3
; 7 3 y ;<- Primary Field is disrupted
; 5 3 z
; 7 4 x ;<- Primary Field is disrupted
; 7 5 a ;<- c$ = a then w
; 7 5 w
; 8 3 2
; 9 3 x
EndDataSection
;-}