Página 1 de 1

Ordenar Array com duas culunas Asort()

Enviado: 12 Set 2016 18:09
por clodoaldomonteiro
Olá amigos!

Tenho uma Array com várias colunas e queria saber se tem como eu ordenar com o Asort() a primeira coluna em ordem Decrescente e a segunda em ordem Crescente?

Desde já agradeço a atenção.

Ordenar Array com duas culunas Asort()

Enviado: 12 Set 2016 18:48
por JoséQuintas
Regra geral do ASort:

Código: Selecionar todos

ASort( aArray, , , { | a, b | a > b } )
A e B são os elementos a comparar, e a expressão é o que usar pra comparar o maior/menor.
Não decorei se crescente/decrescente é .T. ou .F., mas so inverter > <, se precisar.

Então....

Código: Selecionar todos

Asort( aArray, , , { | a, b | a[ 1 ] > b[ 1 ] .OR. ( a [ 1 ] == b[ 1 ] .AND. a[ 2 ] < b[ 2 ] ) } )

Ordenar Array com duas culunas Asort() - RESOLVIDO

Enviado: 13 Set 2016 10:16
por clodoaldomonteiro
Meu amigo Quintas,

Muito obrigado pela pronta ajuda, ficou muito bom mesmo.

Ordenar Array com duas culunas Asort()

Enviado: 14 Set 2016 08:26
por Euclides
Olá pessoal!
Só para efeito de ilustração:

Código: Selecionar todos

ASort( aArray, nil, nil, { |x,y| If( x[ 1 ] == y[ 1 ], x[ 2 ] < y[ 2 ], x[ 1 ] < y[ 1 ] ) } )
Eu acho esta mais "elegante"...
T+, Euclides

Ordenar Array com duas culunas Asort()

Enviado: 14 Set 2016 09:10
por JoséQuintas
Concordo.
Fica instantâneo decifrar o que acontece.
Só acho desnecessário usar NIL, apesar de destacar a necessidade de dois elementos vazios.

Ordenar Array com duas culunas Asort()

Enviado: 15 Set 2016 13:46
por clodoaldomonteiro
Muito obrigado Euclides.
Valeu mesmo.

Ordenar Array com duas culunas Asort()

Enviado: 16 Jul 2018 15:38
por clodoaldomonteiro
Reabrindo o Tópico.

Precisei ordenar por 3 colunas e vejam como ficou:

Código: Selecionar todos

ASort(aDespesa, , , { |x, y| If( x[ 1 ] == y[ 1 ], x[ 2 ] < y[ 2 ], If( x[ 2 ] == y[ 2 ], x[ 3 ] < y[ 3 ], x[ 1 ] < y[ 1 ] )) } )

Ordenar Array com duas culunas Asort()

Enviado: 16 Jul 2018 20:06
por JoséQuintas
Tenho a impressão de que a segunda análise está errada.

Código: Selecionar todos

ASort( aDespesa, { | x, y | iif(  x[ 1 ] == y[ 1 ], iif( x[ 2 ] == y[ 2 ], x[ 3 ] < y[ 3 ], x[ 2 ] < y[ 2 ] ), x[ 1 ] < y[ 1 ] ) } )
 

Ordenar Array com duas culunas Asort()

Enviado: 16 Jul 2018 20:19
por JoséQuintas
É isso mesmo.
Na anterior, se o primeiro for igual, apenas analisa o segundo e deixa o terceiro sem ordenar.
E se o primeiro for diferente, analisa se o segundo é igual pra decidir, e deixa o primeiro sem ordenar e talvez o terceiro também.

No que coloquei:
Se o primeiro e o segundo forem iguais, analisa o terceiro.
Se apenas o primeiro for igual, analisa o segundo.
Se o primeiro for diferente, analisa o primeiro.