Árvore de páginas

Carregando...

Ordena uma parte ou o array inteiro.

Sintaxe

ASort( < aVetor >, [ nInicio ], [ nCont ], [ bOrdem ] )

Parâmetros

Nome

Tipo

Descrição

Obrigatório

Referência

aVetor

array

Indica o array cujos elementos serão ordenados.

X


nInicio

numeric

Indica a partir de qual elemento a ordenação será iniciada. Caso não seja especificado, a posição inicial será um (1).



nCont

numeric

Indica a quantidade de elementos que serão ordenados. Caso não seja especificado, todos elementos a partir do nInicio serão ordenados.



bOrdem

codeblock

Indica o bloco de código utilizado para determinar a ordem que será seguida. Caso não seja especificado, a ordem padrão será ascendente.



Retorno

Nome

Tipo

Descrição

aRetorno

array

Retorna uma referência ao array de origem aVetor.

Observações

Quando queremos ordenar um array de elementos simples em ordem ascendente (do menor elemento para o maior elemento), por exemplo um array de strings ou de números, não é necessário informar o bloco de código para ordenação. Devemos ter em mente que, em um array simples, todos os elementos devem ter dados do mesmo tipo AdvPL. Por exemplo, todos os elementos podem ser do tipo C (Caractere) ou N (Numérico), ou D (Data AdvPL). Como a ordenação é realizada sobre a comparação entre elementos, caso existam elementos de tipos diferentes, a aplicação AdvPL pode ser finalizada com a ocorrência de erro "invalid typecast on compare".

Ao informar o bloco de código para ordenação, ele deve ser construído para receber dois elementos quaisquer do array informado em aVetor, e deve retornar .T. (true) caso os elementos estejam na ordem esperada (primeiro antes do segundo). Por exemplo, o bloco de código internamente utilizado para ordenar um array de tipos simples é similar a "{ |x,y| x < y }", onde x é o primeiro elemento, y é o segundo elemento, e a expressão de comparação retorna verdadeiro quando o primeiro elemento é menor que o segundo, o que resulta em um array em ordem ascendente.

Lembrando que, quando é informado o bloco de código, ele será chamado no mínimo uma vez para cada par de elementos do array, e quantas vezes mais forem necessárias para garantir a ordenação desejada. Quanto maior e mais fora de ordem está o array informado, mais vezes o bloco de código será chamado. Quando o array informado possui dois ou mais elementos de mesmo valor, a ordem desses elementos após o sorteio é aleatória. Por exemplo, um array de duas dimensões, contendo dois elementos, nesta ordem :

aArr := {{'a',1},{'b',2},{'a',3},{'b',4},{'a',5},{'b',6} }
aSort(aArr ,,, { |x,y| x[1] < y[1] } )

A comparação feita pelo bloco de código garante que todos os elementos onde a primeira coluna com "a" vêm antes dos demais elementos com "b". Os arrays com a primeira coluna "a" podem ter a segunda coluna com os valores 1, 3 ou 5. Essa ordem da criação do array pode não ser respeitada, o resultado final pode ficar com "{'a',3} , {'a',1} , {'a',5 }". Se existe a necessidade de ordenação por chave composta, onde os elementos repetidos devem seguir por exemplo uma ordem crescente, voce deve criar um bloco de código para montar uma chave composta, considerando os dois valores, por exemplo:

aArr := {{'a',1},{'b',2},{'a',3},{'b',4},{'a',5},{'b',6} }
aSort(aArr ,,, { |x,y| x[1]+strzero(x[2],4) < y[1]+strzero(y[2],4) } )

Outra forma de obter o mesmo resultado é criar uma condição de comparação que avalie a expressão quando o valor das colunas é igual ou diferente, por exemplo:

aArr := {{'a',1},{'b',2},{'a',3},{'b',4},{'a',5},{'b',6} }
aSort(aArr ,,, { |x,y| IIF(x[1] == y[1] , x[2] < y[2] , x[1] < y[1] ) } )

Com a expressão acima, primeiro é avaliado se os valores dos elementos da primeira coluna são iguais. Caso sejam iguais, é avaliada a ordenação da segunda coluna, e caso sejam diferentes, é avaliada a ordem ascendente da primeira coluna.

Exemplos

#include “TOTVS.ch”
User function Exemplo()
  Local aExemplo := {}
  Local cMensagem := ""
  //+----------------------------------------------------------------------------+
  //|Exemplifica o uso da função ASort                                           |
  //+----------------------------------------------------------------------------+
  AAdd(aExemplo, "Banana")
  AAdd(aExemplo, "Maçã")
  AAdd(aExemplo, "Pêra")
  AAdd(aExemplo, "Limão")
  AAdd(aExemplo, "Abacaxi")
  AAdd(aExemplo, "Laranja")
  AAdd(aExemplo, "Mamão")
  AAdd(aExemplo, "Graviola")
  ASort(aExemplo)
  cMensagem += "Ordem crescente: " + CRLF
  cMensagem += aExemplo[1] + CRLF
  cMensagem += aExemplo[2] + CRLF
  cMensagem += aExemplo[3] + CRLF
  cMensagem += aExemplo[4] + CRLF
  cMensagem += aExemplo[5] + CRLF
  cMensagem += aExemplo[6] + CRLF
  cMensagem += aExemplo[7] + CRLF
  cMensagem += aExemplo[8] + CRLF
  ASort(aExemplo, , , {|x,y|x > y})
  cMensagem += "Ordem decrescente: " + CRLF
  cMensagem += aExemplo[1] + CRLF
  cMensagem += aExemplo[2] + CRLF
  cMensagem += aExemplo[3] + CRLF
  cMensagem += aExemplo[4] + CRLF
  cMensagem += aExemplo[5] + CRLF
  cMensagem += aExemplo[6] + CRLF
  cMensagem += aExemplo[7] + CRLF
  cMensagem += aExemplo[8] + CRLF
  //+----------------------------------------------------------------------------+
  //|Apresenta uma mensagem com os resultados obtidos                            |
  //+----------------------------------------------------------------------------+
return MsgInfo(cMensagem, "Exemplo do ASort")

Resultado do Exemplo

Abrangência

Application Server 13.0.0.0

Veja também

  • Sem rótulos