Ordenar array usando apenas uma parte da string

Fórum sobre a linguagem CA-Clipper.

Moderador: Moderadores

Avatar do usuário
ANDRIL
Usuário Nível 5
Usuário Nível 5
Mensagens: 1297
Registrado em: 06 Jul 2004 00:44
Contato:

Ordenar array usando apenas uma parte da string

Mensagem 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.
Clipper 5.2e / Blinker 5.1 / Harbour 3.2 / GTwvg
Avatar do usuário
Maligno
Membro Master
Membro Master
Mensagens: 6398
Registrado em: 06 Jul 2004 01:40
Localização: Londrina/PR

Re: Ordenar array usando apenas uma parte da string

Mensagem 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.
[]'s
Maligno
---
Não respondo questões técnicas através de MP ou eMail. Não insista.
As dúvidas devem ser postadas no fórum. Desta forma, todos poderão
se beneficiar das respostas.

---
Se um dia precisar de uma transfusão de sangue você perceberá como
é importante a figura do doador. Procure o hemocentro de sua cidade e
se informe sobre a doação de sangue, plaquetas e medula óssea. Doe!
Avatar do usuário
ANDRIL
Usuário Nível 5
Usuário Nível 5
Mensagens: 1297
Registrado em: 06 Jul 2004 00:44
Contato:

Re: Ordenar array usando apenas uma parte da string

Mensagem 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?
Clipper 5.2e / Blinker 5.1 / Harbour 3.2 / GTwvg
Avatar do usuário
Maligno
Membro Master
Membro Master
Mensagens: 6398
Registrado em: 06 Jul 2004 01:40
Localização: Londrina/PR

Re: Ordenar array usando apenas uma parte da string

Mensagem 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.
[]'s
Maligno
---
Não respondo questões técnicas através de MP ou eMail. Não insista.
As dúvidas devem ser postadas no fórum. Desta forma, todos poderão
se beneficiar das respostas.

---
Se um dia precisar de uma transfusão de sangue você perceberá como
é importante a figura do doador. Procure o hemocentro de sua cidade e
se informe sobre a doação de sangue, plaquetas e medula óssea. Doe!
alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

Re: Ordenar array usando apenas uma parte da string

Mensagem 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)}) 
[]´s
Alexandre Santos (AlxSts)
Avatar do usuário
Maligno
Membro Master
Membro Master
Mensagens: 6398
Registrado em: 06 Jul 2004 01:40
Localização: Londrina/PR

Re: Ordenar array usando apenas uma parte da string

Mensagem 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. :)
[]'s
Maligno
---
Não respondo questões técnicas através de MP ou eMail. Não insista.
As dúvidas devem ser postadas no fórum. Desta forma, todos poderão
se beneficiar das respostas.

---
Se um dia precisar de uma transfusão de sangue você perceberá como
é importante a figura do doador. Procure o hemocentro de sua cidade e
se informe sobre a doação de sangue, plaquetas e medula óssea. Doe!
Avatar do usuário
ANDRIL
Usuário Nível 5
Usuário Nível 5
Mensagens: 1297
Registrado em: 06 Jul 2004 00:44
Contato:

Re: Ordenar array usando apenas uma parte da string

Mensagem 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
Clipper 5.2e / Blinker 5.1 / Harbour 3.2 / GTwvg
Avatar do usuário
Pablo César
Usuário Nível 7
Usuário Nível 7
Mensagens: 5312
Registrado em: 31 Mai 2006 10:22
Localização: Curitiba - Paraná

Ordenar array usando apenas uma parte da string

Mensagem 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...
Um clip-abraço !

Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
Avatar do usuário
Maligno
Membro Master
Membro Master
Mensagens: 6398
Registrado em: 06 Jul 2004 01:40
Localização: Londrina/PR

Re: Ordenar array usando apenas uma parte da string

Mensagem por Maligno »

O código do Alexandre funciona. Talvez você esteja invertendo alguma coisa.
[]'s
Maligno
---
Não respondo questões técnicas através de MP ou eMail. Não insista.
As dúvidas devem ser postadas no fórum. Desta forma, todos poderão
se beneficiar das respostas.

---
Se um dia precisar de uma transfusão de sangue você perceberá como
é importante a figura do doador. Procure o hemocentro de sua cidade e
se informe sobre a doação de sangue, plaquetas e medula óssea. Doe!
Avatar do usuário
ANDRIL
Usuário Nível 5
Usuário Nível 5
Mensagens: 1297
Registrado em: 06 Jul 2004 00:44
Contato:

Re: Ordenar array usando apenas uma parte da string

Mensagem 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.
Clipper 5.2e / Blinker 5.1 / Harbour 3.2 / GTwvg
Avatar do usuário
Pablo César
Usuário Nível 7
Usuário Nível 7
Mensagens: 5312
Registrado em: 31 Mai 2006 10:22
Localização: Curitiba - Paraná

Re: Ordenar array usando apenas uma parte da string

Mensagem 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.
Um clip-abraço !

Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
Responder