Página 1 de 1
Ordenar array usando apenas uma parte da string
Enviado: 12 Jan 2011 09:01
por ANDRIL
Amigos, estou tentando classificar um array e nao estou tendo êxito, embora seja um array unidimensional.
Código: Selecionar todos
aFeriados:={"25/12 Natal",;
"07/09 Independencia do Brasil",;
"01/01 Confraternizacao",;
"08/02 Carnaval"}
aSort(aFeriados) //nao funcionou
aSort(aFeriados, {|x| left(x,5)}) //tambem nao funcionou
*--teria que ficar assim
*01/01
*08/02
*07/09
*25/12
Ja tentei tirar a parte das referencias do feriado deixando apenas a dia/mes tambem nao adiantou. Tem como fazer isso, sem ter que fazer conversao da data para segundos?
Abraços.
Re: Ordenar array usando apenas uma parte da string
Enviado: 12 Jan 2011 09:30
por Maligno
Quando usar uma expressão complexa para ordenar uma matriz, mesmo que unidimensional, não se esqueça que o bloco de ordenação receberá dois argumentos, que são os que precisarão ser comparados. Então,...
Código: Selecionar todos
aSort(aFeriados,{|x,y| Right(x[1],2)+Left(x[1],2) < Right(y[1],2)+Left(y[1],2)})
Acho que deve resolver.
Re: Ordenar array usando apenas uma parte da string
Enviado: 12 Jan 2011 09:46
por ANDRIL
Maligno, obrigado pela resposta, mais infelizmente nao adiantou.
Código: Selecionar todos
aFeriados:={"10/02","05/01","02/02","11/05","08/04"}
aSort(aFeriados,{|x,y| Right(x[1],2)+Left(x[1],2) < Right(y[1],2)+Left(y[1],2)})
Resultado
0202 [2]
0105 [1]
0408 [4]
0210 [3]
0511 [5]
Entre colchetes estao as posicoes corretas em que deveria aparecer.
Alguma outra ideia?
Re: Ordenar array usando apenas uma parte da string
Enviado: 12 Jan 2011 09:56
por Maligno
Desculpe. Esqueci que era um texto. Deve ser o hábito de só usar isso em matrizes multidimensionais. Troque por:
Código: Selecionar todos
aSort(aFeriados,{|x,y| SubStr(x[1],4,2)+Left(x[1],2) < SubStr(y[1],4,2)+Left(y[1],2)})
De qualquer maneira, a idéia é como usar um bloco para alterar o método de ordenação. No seu caso específico, você só tem que juntar as partes da forma mais apropriada para a comparação.
Re: Ordenar array usando apenas uma parte da string
Enviado: 12 Jan 2011 10:08
por alxsts
Olá!
Era o que eu ia sugerir, usando Substr(). Como se trata de data, é preciso classificar por mes e depois por dia, nesta ordem.
Observe que na sintaxe de ASort() tem alguns parâmetros a mais. No exemplo abaixo, os parâmetros foram omitidos. Testei e funciona.
Código: Selecionar todos
aFeriados := aSort(aFeriados,,,{|x,y| Substr(x,4,2)+Left(x,2) < Substr(y,4,2)+Left(y,2)})
Re: Ordenar array usando apenas uma parte da string
Enviado: 12 Jan 2011 10:13
por Maligno
Sim, exatamente. Faz tempo que não uso o ASort. Esqueci das vírgulas a mais. E a indexação não pode aparecer. Seu código deve estar certo. Obrigado pela correção.

Re: Ordenar array usando apenas uma parte da string
Enviado: 12 Jan 2011 10:19
por ANDRIL
Maligno, tentei como vc especificou e tbem nao deu certo.
Eu uso o bloco de codigo para que a ordenação siga a regra que definimos no bloco e ai que esta o problema.
Veja que no seu exemplo, voce esta colocando o mes na frente e em seguida o dia, para que seja classificado por mes.
Esta retornando sempre pelo dia, ou seja, so o dia é classificado, mesmo usando seu codigo acima, parece que a funcao aSort() nao esta exergando o bloco.
Não consegui ainda descobrir o porque, mesmo passando para trabalhar invertidamente pelo mes, ele classifica o dia, como se nao tivesse o bloco especificado na função.
Continuo tentando aqui...
Abraços
Ordenar array usando apenas uma parte da string
Enviado: 12 Jan 2011 10:45
por Pablo César
Anderson, teste desta forma:
Código: Selecionar todos
aFeriados:={"25/12 Natal",;
"07/09 Independencia do Brasil",;
"01/01 Confraternizacao",;
"08/02 Carnaval"}
aFeriados:=aSort(aFeriados,,,{|x,y| Val(Substr(x,4,2)+Substr(x,1,2)) < Val(Substr(y,4,2)+Substr(y,1,2)) })
cls
ACHOICE(02,09,20,43,aFeriados)
Estava mal interpretando os 2º e 3º argumentos como se fosse o 4º da ASORT().
Ehhtahh delicia de assunto, adoro. O Maligno foi rápido no gatilho, senão eu ja tinha respondido... (gosto muito de tratamento de substrings) mas na pressa você devem ter esquecido do ",,," antes do BLOCO...
Re: Ordenar array usando apenas uma parte da string
Enviado: 12 Jan 2011 10:46
por Maligno
O código do Alexandre funciona. Talvez você esteja invertendo alguma coisa.
Re: Ordenar array usando apenas uma parte da string
Enviado: 12 Jan 2011 10:54
por ANDRIL
Alxsts, matou a pau, foram as virgulas mesmo, sem as virgulas o bloco nao era passado corretamente.
Os demais exemplos funcionam perfeitamente, o que estava me intrigando era a nao execução do bloco.
OBS: Foi desatenção minha também, por que antes de postar estava usando as virgulas, mais como nao estava informando 2 parametros no bloco tbem nao funcionava.
Obrigado a todos.
Re: Ordenar array usando apenas uma parte da string
Enviado: 12 Jan 2011 10:57
por Pablo César
Meu... tudo foi tão rápido (um post trás do outro...) que eu acabei postando o mesmo que o o Alexandre... (pareceu que eu copiei o que ele falava...) rsrs . Mas o importante que foi resolvido.