Olá!
No passado também precisei deste tipo de função e também criei. Interessante que uma delas eu batizei com o nome AMax(), para manter a semelhança com os nomes de funções de array do Cl*pper. A diferença é que as minhas tratam arrays multidimensionais.
// Testes de funções diversas (aggregate)
// Compilar: hbmk2 teste -w3 -es2 -run
// Alexandre Santos
FUNCTION Teste()
LOCAL aUni := { 50,81,23,96,81 }, aUf
REQUEST HB_LANG_PT
REQUEST HB_CODEPAGE_PTISO
HB_CDPSELECT("PTISO")
aUf := { ;//Região UF Nome UF Área Popula. Municípios
{ "Norte", "AC", "Acre", 164123, 869265, 22 }, ;
{ "Norte", "AM", "Amazonas", 1559146, 4080611, 62 }, ;
{ "Norte", "AP", "Amapá", 142828, 829494, 16 }, ;
{ "Norte", "TO", "Tocantins", 277620, 1550194, 139 }, ;
{ "Norte", "PA", "Pará", 1247954, 8578051, 144 }, ;
{ "Norte", "RR", "Roraima", 224300, 576568, 15 }, ;
{ "Norte", "RO", "Rondônia", 237590, 1787279, 52 }, ;
{ "Nordeste", "CE", "Ceará", 148920, 9075649, 184 }, ;
{ "Nordeste", "AL", "Alagoas", 27848, 3322820, 102 }, ;
{ "Nordeste", "BA", "Bahia", 584733, 14812617, 417 }, ;
{ "Nordeste", "MA", "Maranhão", 331937, 7035055, 217 }, ;
{ "Nordeste", "PB", "Paraíba", 56469, 3996496, 223 }, ;
{ "Nordeste", "PE", "Pernambuco", 98149, 9496294, 185 }, ;
{ "Nordeste", "PI", "Piauí", 251577, 3264531, 224 }, ;
{ "Nordeste", "RN", "Rio Grande do Norte", 52811, 3479010, 167 }, ;
{ "Nordeste", "SE", "Sergipe", 21915, 2278308, 75 }, ;
{ "Centro-Oeste", "GO", "Goiás", 340111, 6991161, 246 }, ;
{ "Centro-Oeste", "MT", "Mato Grosso", 903378, 3441998, 141 }, ;
{ "Centro-Oeste", "MS", "Mato Grosso do Sul", 357145, 2478023, 77 }, ;
{ "Centro-Oeste", "DF", "Distrito Federal", 5779, 3039444, 1 }, ;
{ "Sudeste", "ES", "Espírito Santo", 46095, 4016356, 78 }, ;
{ "Sudeste", "MG", "Minas Gerais", 586522, 21119536, 853 }, ;
{ "Sudeste", "RJ", "Rio de Janeiro", 43780, 16718956, 92 }, ;
{ "Sudeste", "SP", "São Paulo", 248222, 45538936, 645 }, ;
{ "Sul", "PR", "Paraná", 199307, 11348937, 399 }, ;
{ "Sul", "SC", "Santa Catarina", 95736, 6910553, 295 }, ;
{ "Sul", "RS", "Rio Grande do Sul", 281730, 11329605, 497 } ;
}
SetMode( 43,120 )
CLS
SetPos( 10,10) ; QOut( "Maior população por estado ", AMax( aUF, 5 ) )
SetPos( 11,10) ; QOut( "Menor população por estado ", AMin( aUF, 5 ) )
SetPos( 12,10) ; QOut( "População Média ", AAvg( aUF, 5 ) )
SetPos( 13,10) ; QOut( "Qtd. Municípios Região Sul ", ASum( aUF, 6, { |x| x[1] == "Sul" } ) )
SetPos( 14,10) ; QOut( "Qtd. Estados Região Norte ", ACount( aUF, { |x| x[1] == "Norte" } ) )
SetPos( 15,10) ; QOut( "Qtd. Estados Região Sul+Norte ", ACount( aUF, { |x| x[1] $ "Sul;Norte" } ) )
SetPos( 17,10) ; QOut( Replicate( "-", 70 ) )
SetPos( 19,10) ; QOut( "Max Unidimensional ", AMax( aUni ) )
SetPos( 20,10) ; QOut( "Min Unidimensional ", AMin( aUni ) )
SetPos( 21,10) ; QOut( "Sum Unidimensional ", ASum( aUni ) )
SetPos( 22,10) ; QOut( "Avg Unidimensional ", AAvg( aUni ) )
SetPos( 23,10) ; QOut( "ACount Unidimensional ", ACount( aUni, { |x| x == 81 } ) )
Inkey(0)
RETURN NIL
//----------------------------------------------------------------------------------------------------
FUNCTION AMax( aArray, nCol )
// Alexandre Santos
LOCAL xVal
If ( ValType( aArray ) == "A" .And. ! Empty( aArray ) )
If ( ValType( aArray[1] ) == "A" .And. ! Empty( aArray[1] ) )
// Multidimensional
If ( Valtype( nCol ) != "N" .Or. ( Valtype( nCol ) == "N" .And. nCol > Len( aArray[1] ) ) )
nCol := 1
Endif
xVal := aArray[1,nCol]
AEval( aArray, { |e| xVal := If( e[nCol] != NIL .And. e[nCol] > xVal, e[nCol], xVal ) } )
Else
// Unidimensional
xVal := aArray[1]
AEval( aArray, { |e| xVal := If( e != NIL .And. e > xVal, e, xVal ) } )
Endif
Endif
RETURN xVal
//----------------------------------------------------------------------------------------------------
FUNCTION AMin( aArray, nCol )
// Alexandre Santos
LOCAL xVal
If ( ValType( aArray ) == "A" .And. ! Empty( aArray ) )
If ( ValType( aArray[1] ) == "A" .And. ! Empty( aArray[1] ) )
// Multidimensional
If ( Valtype( nCol ) != "N" .Or. ( Valtype( nCol ) == "N" .And. nCol > Len( aArray[1] ) ) )
nCol := 1
Endif
xVal := aArray[1,nCol]
AEval( aArray, { |e| xVal := If( e[nCol] != NIL .And. e[nCol] < xVal, e[nCol], xVal ) } )
Else
// Unidimensional
xVal := aArray[1]
AEval( aArray, { |e| xVal := If( e != NIL .And. e < xVal, e, xVal ) } )
Endif
Endif
RETURN xVal
//----------------------------------------------------------------------------------------------------
FUNCTION ASum( aArray, nCol, bFor )
// Alexandre Santos
LOCAL nVal := 0
If ( ValType( aArray ) == "A" .And. ! Empty( aArray ) )
If ( ValType( aArray[1] ) == "A" .And. ! Empty( aArray[1] ) )
// Multidimensional
If ( Valtype( nCol ) != "N" .Or. ( Valtype( nCol ) == "N" .And. nCol > Len( aArray[1] ) ) )
nCol := 1
Endif
bFor := If( Valtype( bFor ) != "B", { || .T. }, bFor )
AEval( aArray, { |e| nVal += If( Valtype( e[nCol] ) == "N" .And. Eval( bFor, e, nCol ), e[nCol], 0 ) } )
Else
// Unidimensional
AEval( aArray, { |e| nVal += If( Valtype( e ) == "N", e, 0 ) } )
Endif
Endif
RETURN nVal
//----------------------------------------------------------------------------------------------------
FUNCTION AAvg( aArray, nCol )
// Alexandre Santos
LOCAL nVal := 0
If ( ValType( aArray ) == "A" .And. ! Empty( aArray ) )
If ( ValType( aArray[1] ) == "A" .And. ! Empty( aArray[1] ) )
// Multidimensional
If ( Valtype( nCol ) != "N" .Or. ( Valtype( nCol ) == "N" .And. nCol > Len( aArray[1] ) ) )
nCol := 1
Endif
nVal := ASum( aArray, nCol )
Else
// Unidimensional
nVal := ASum( aArray )
Endif
Endif
RETURN ( nVal / Len( aArray ) )
//----------------------------------------------------------------------------------------------------
FUNCTION ACount( aArray, bFilter )
// Alexandre Santos
LOCAL nCount := 0
bFilter := If( Valtype( bFilter ) != "B", { || .T. }, bFilter )
If ( Valtype( aArray ) == "A" .And. ! Empty( aArray ) )
AEval( aArray, { |e| nCount += If( Eval( bFilter, e ), 1, 0 ) } )
Endif
RETURN nCount
//----------------------------------------------------------------------------------------------------
Resultados dos testes.
Maior população por estado 45538936
Menor população por estado 576568
População Média 7702435.07
Qtd. Municípios Região Sul 1191
Qtd. Estados Região Norte 7
Qtd. Estados Região Sul+Norte 10
----------------------------------------------------------------------
Max Unidimensional 96
Min Unidimensional 23
Sum Unidimensional 331
Avg Unidimensional 66.20
ACount Unidimensional 2