Ordenar Array com duas culunas Asort()

Projeto [x]Harbour - Compilador de código aberto compatível com o Clipper.

Moderador: Moderadores

Avatar do usuário
clodoaldomonteiro
Usuário Nível 4
Usuário Nível 4
Mensagens: 821
Registrado em: 30 Dez 2006 13:17
Localização: Teresina-PI
Contato:

Ordenar Array com duas culunas Asort()

Mensagem 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.
At. Clodoaldo Monteiro
Linguagens: Clipper / Harbour
Área de Atuação: Sistemas de gestão para Prefeituras Municipais
Fones: (86)3223-0653, 98859-0236
www.simplesinformatica.com.br
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20453
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP
Curtiram: 1 vez

Ordenar Array com duas culunas Asort()

Mensagem 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 ] ) } )
José M. C. Quintas
Harbour 3.2, mingw, multithread, gtwvg, fivewin 25.12, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui), (hmg3), (hmg extended), (oohg), PNotepad, ASP, (Linux/Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
clodoaldomonteiro
Usuário Nível 4
Usuário Nível 4
Mensagens: 821
Registrado em: 30 Dez 2006 13:17
Localização: Teresina-PI
Contato:

Ordenar Array com duas culunas Asort() - RESOLVIDO

Mensagem por clodoaldomonteiro »

Meu amigo Quintas,

Muito obrigado pela pronta ajuda, ficou muito bom mesmo.
At. Clodoaldo Monteiro
Linguagens: Clipper / Harbour
Área de Atuação: Sistemas de gestão para Prefeituras Municipais
Fones: (86)3223-0653, 98859-0236
www.simplesinformatica.com.br
Euclides
Usuário Nível 3
Usuário Nível 3
Mensagens: 154
Registrado em: 12 Mai 2007 14:07
Localização: São Paulo, Capital

Ordenar Array com duas culunas Asort()

Mensagem 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
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20453
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP
Curtiram: 1 vez

Ordenar Array com duas culunas Asort()

Mensagem 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.
José M. C. Quintas
Harbour 3.2, mingw, multithread, gtwvg, fivewin 25.12, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui), (hmg3), (hmg extended), (oohg), PNotepad, ASP, (Linux/Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
clodoaldomonteiro
Usuário Nível 4
Usuário Nível 4
Mensagens: 821
Registrado em: 30 Dez 2006 13:17
Localização: Teresina-PI
Contato:

Ordenar Array com duas culunas Asort()

Mensagem por clodoaldomonteiro »

Muito obrigado Euclides.
Valeu mesmo.
At. Clodoaldo Monteiro
Linguagens: Clipper / Harbour
Área de Atuação: Sistemas de gestão para Prefeituras Municipais
Fones: (86)3223-0653, 98859-0236
www.simplesinformatica.com.br
Avatar do usuário
clodoaldomonteiro
Usuário Nível 4
Usuário Nível 4
Mensagens: 821
Registrado em: 30 Dez 2006 13:17
Localização: Teresina-PI
Contato:

Ordenar Array com duas culunas Asort()

Mensagem 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 ] )) } )
At. Clodoaldo Monteiro
Linguagens: Clipper / Harbour
Área de Atuação: Sistemas de gestão para Prefeituras Municipais
Fones: (86)3223-0653, 98859-0236
www.simplesinformatica.com.br
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20453
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP
Curtiram: 1 vez

Ordenar Array com duas culunas Asort()

Mensagem 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 ] ) } )
 
José M. C. Quintas
Harbour 3.2, mingw, multithread, gtwvg, fivewin 25.12, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui), (hmg3), (hmg extended), (oohg), PNotepad, ASP, (Linux/Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20453
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP
Curtiram: 1 vez

Ordenar Array com duas culunas Asort()

Mensagem 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.
José M. C. Quintas
Harbour 3.2, mingw, multithread, gtwvg, fivewin 25.12, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui), (hmg3), (hmg extended), (oohg), PNotepad, ASP, (Linux/Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Responder