SortArrayByComparison, ConcatArrays, FilterArray, TestArray

Share your advanced knowledge/code with the community.
User avatar
eddy
Posts: 124
Joined: Thu Mar 27, 2014 8:34 am

SortArrayByComparison, ConcatArrays, FilterArray, TestArray

Post by eddy »

- sort array using custom fonction
- concat 2 arrays
- filter array
- test all / any array elements
Caution, there's no compiler validation on argument types or array dimensions. Javascript can generate some hybrid results

Code: Select all

Prototype.i _CompareElements(*Element1, *Element2)
Prototype.i _KeepElement(*Element)
Prototype.i _TestElement(*Element, Index, *Array)


Procedure SortArrayByComparison(*ArrayToSort, *Function._CompareElements) 
  !p_ArrayToSort.array.sort(p_Function);  
EndProcedure

Procedure.i FilterArray(*ArrayToFilter, *Function._KeepElement, *ResultArray=#Null)   
  If Not *ResultArray : *ResultArray=*ArrayToFilter : EndIf   
  
  ;update array data
  !var filteredArray=p_ArrayToFilter.array.filter(p_Function),      
  !    filteredLength=filteredArray.length-1
  !p_ResultArray.array=filteredArray
  ;update array size
  !spider_ReDim(p_ResultArray,(filteredLength<0)?0:filteredLength);
  
  ;retrieves result array size (-1 means empty result)
  !return filteredLength;
EndProcedure

Procedure.i ConcatArrays(*Array1, *Array2, *ResultArray)  
  !p_ResultArray.array=p_Array1.array.concat(p_Array2.array);  
  !p_ResultArray.dimensions[0]=p_ResultArray.array.length-1;
  
  ;retrieves result array size
  !return p_ResultArray.array.length-1;
EndProcedure

Procedure.i TestArray(*ArrayToTest, *Function._TestElement, Flag=0)    
  Select Flag
    Case #PB_All
      !return p_ArrayToTest.array.every(p_Function);
    Default 
      !return p_ArrayToTest.array.some(p_Function);
  EndSelect   
EndProcedure

CompilerIf #PB_Compiler_IsMainFile
  ; *************************
  ; EXAMPLE 
  ; *************************
  Structure MY_TYPE
    text.s
    value.i
  EndStructure
  
  Procedure.i CompareValues(*a.MY_TYPE,*b.MY_TYPE)
    ;ProcedureReturn (*b\value-*a\value) ;value descending
    ProcedureReturn (*a\value-*b\value) ;value ascending
  EndProcedure 
  
  Procedure.i CompareStringsValues(*a.MY_TYPE,*b.MY_TYPE)
    If *a\text<>*b\text
      ProcedureReturn 1-2*Bool(*a\text<*b\text) ;string ascending     
    Else
      ProcedureReturn (*a\value-*b\value) ;value ascending
    EndIf               
  EndProcedure 
  
  Procedure.i KeepValueBeginsWith11(*a.MY_TYPE)
    ProcedureReturn Bool(Mid(""+*a\value,1,2)="11") ;keep element if TRUE
  EndProcedure
  
  Procedure.i ValueGreaterThan50(*a.MY_TYPE, Index, *Array)
    ProcedureReturn Bool(*a\value>50)
  EndProcedure
  
  
  Dim firstArr.MY_TYPE(9)  
  Dim secondArr.MY_TYPE(9)  
  Dim resultArr.MY_TYPE(0)  
  For i=0 To ArraySize(firstArr())
    firstArr(i)\value=100+Random(10)
    firstArr(i)\text=Chr('a'+Random(10))
  Next 
  For i=0 To ArraySize(secondArr())
    secondArr(i)\value=Random(10)
    secondArr(i)\text=Chr('a'+Random(25, 10))
  Next   
  
  Debug #LF$+"Concat two arrays..."    
  concatLength=ConcatArrays(firstArr(),secondArr(),resultArr())
  For i=0 To concatLength
    Debug "concatenated: "+resultArr(i)\text+" "+resultArr(i)\value
  Next   
  
  Debug #LF$+"Sort by value..."  
  SortArrayByComparison(resultArr(),@CompareValues())
  For i=0 To ArraySize(resultArr())
    Debug "sorted: "+resultArr(i)\value+" "+resultArr(i)\text
  Next 
  
  Debug #LF$+"Sort by string and value..."  
  SortArrayByComparison(resultArr(),@CompareStringsValues())
  For i=0 To ArraySize(resultArr())
    Debug "sorted: "+resultArr(i)\text+" "+resultArr(i)\value
  Next 
  
  Debug #LF$+"Test array elements..."
  If TestArray(resultArr(),@ValueGreaterThan10(),#PB_All)
    Debug "All values are greater than 50."
  EndIf 
  If TestArray(resultArr(),@ValueGreaterThan50())
    Debug "At least one of the values is greater than 50."
  EndIf 
  
  Debug #LF$+"Filter values begin with 11..."  
  filterLength=FilterArray(resultArr(),@KeepValueBeginsWith11())  
  For i=0 To filterLength
    Debug "filtered: "+resultArr(i)\text+" "+resultArr(i)\value
  Next 
CompilerEndIf
Last edited by eddy on Sun Jan 04, 2015 3:50 am, edited 11 times in total.
davido
Posts: 10
Joined: Mon Feb 24, 2014 10:22 pm
Location: Uttoxeter UK

Re: SortArrayFunction

Post by davido »

Very nice. Thank you. :D
User avatar
eddy
Posts: 124
Joined: Thu Mar 27, 2014 8:34 am

Re: SortArrayFunction, ConcatArrays

Post by eddy »

[Updated]
- method to concat arrays
User avatar
eddy
Posts: 124
Joined: Thu Mar 27, 2014 8:34 am

Re: SortArrayFunction, ConcatArrays

Post by eddy »

[Updated]
- updated example
- fix array size
- TestArray (any or all elements)
Post Reply