Página 1 de 1

Como ordenar Uma Array dentro de Array?

Enviado: 15 Set 2016 17:41
por clodoaldomonteiro
Boas amigos,

Tenho mais uma questão quanto a Array, seguinte:

Imagine a array:

Código: Selecionar todos

aArray:={;
  {'1', {'A', 'B'} },;
  {'7', {'C', 'A'} },;
  {'5', {'M', 'E'} },;
  {'0', {'E', '2'} };
}
Então, estou querendo ordenar a aArray pela primeira culuna e ordenar também a segunda coluna, que é uma Array.

Teria que ficar assim:

Código: Selecionar todos

aArray:={;
  {'0', {'2', 'E'} },;
  {'1', {'A', 'B'} },;
  {'5', {'E', 'M'} },;
  {'7', {'A', 'C'} };
}
Desde já agradeço a atenção de todos.

Como ordenar Uma Array dentro de Array?

Enviado: 15 Set 2016 19:06
por JoséQuintas
Parece complicado, mas.... com FOR/EACH, olhe que legal:

Código: Selecionar todos

ASort( aArray,,, { | a, b | a[ 1 ] < b[ 1 ] } )

FOR EACH oElement IN aArray
   ASort( oElement )
NEXT

Como ordenar Uma Array dentro de Array?

Enviado: 15 Set 2016 19:08
por JoséQuintas
Corrigindo:

Código: Selecionar todos

ASort( aArray,,, { | a, b | a[ 1 ] < b[ 1 ] } )

FOR EACH oElement IN aArray
 ASort( oElement[ 2 ] )
NEXT

Como ordenar Uma Array dentro de Array?

Enviado: 15 Set 2016 19:13
por JoséQuintas
Na dúvida, testei... rs

Código: Selecionar todos

PROCEDURE Main

   LOCAL aArray, oElement

   aArray:={;
    {'1', {'A', 'B'} },;
    {'7', {'C', 'A'} },;
    {'5', {'M', 'E'} },;
    {'0', {'E', '2'} };
   }

   ASort( aArray,,, { | a, b | a[ 1 ] < b[ 1 ] } )
   FOR EACH oElement IN aArray
      ASort( oElement[ 2 ] )
   NEXT
   FOR EACH oElement IN aArray
      ? oElement[ 1 ], oElement[ 2, 1 ], oElement[ 2, 2 ]
   NEXT

   RETURN

Código: Selecionar todos

d:\temp>test

0 2 E
1 A B
5 E M
7 A C

Como ordenar Uma Array dentro de Array?

Enviado: 16 Set 2016 09:51
por clodoaldomonteiro
Caro amigo Quinta!

Fico muito grato pelo pronto atendimento, mas não deu certo, pois por minha falha, informei a Array de uma forma equivocada.

Segue q correta:

Código: Selecionar todos

aArray:=
{;
    {'Setor 1', { {'Araujo', 'Bruno'} ,{'Alves', 'Carla'},{'Gomes', 'Antonio'} } },;
    {'Setor 7', { {'Castro', 'Antonio'},{'Monteiro', 'Francisco'}} },;
    {'Setor 5', { {'Gomes', 'Karol'}, {'Frazao', 'Carlos'}, {'Quintas', 'José'}, {'Toledo', 'Paulo'}} },;
    {'Setor 0', { {'Silva', 'Luiz'}, {'Sousa', 'Mariza'}} };
   }
Veja que o segundo Elemento de aArray é uma lista de Array's, então, tenho que ordenar pela primeira coluna e pegar a segunda coluna para ordenar pelo sobre nome.

Como ordenar Uma Array dentro de Array?

Enviado: 16 Set 2016 10:35
por JoséQuintas
é um misto deste tópico com o outro que postou antes.

Código: Selecionar todos

#define ORDEM_A   1 /* sobrenome */
#define ORDEM_B   2 /* nome */

ASort( aArray,,, { | a, b | a[ 1 ] < b[ 1 ] } )
FOR EACH oElement IN aArray[ 2 ]
   ASort( oElement,,, { | a, b | iif( a[ ORDEM_A ] == b[ ORDEM_A ], a[ ORDEM_B ] < b[ ORDEM_B ], a[ ORDEM_A ] < b[ ORDEM_A ] } )
NEXT
Só escolher se quer nome/sobrenome ou sobrenome/nome alterando a definição de ORDEM_A e ORDEM_B.... rs

Como ordenar Uma Array dentro de Array?

Enviado: 16 Set 2016 11:22
por JoséQuintas
Correção, inverti:

Código: Selecionar todos

#define ORDEM_A 1 /* sobrenome */
#define ORDEM_B 2 /* nome */

ASort( aArray,,, { | a, b | a[ 1 ] < b[ 1 ] } )
FOR EACH oElement IN aArray
 ASort( oElement[ 2 ],,, { | a, b | iif( a[ ORDEM_A ] == b[ ORDEM_A ], a[ ORDEM_B ] < b[ ORDEM_B ], a[ ORDEM_A ] < b[ ORDEM_A ] } )
NEXT
Cada elemento do array principal é isto { 'dddd', { { 'a', 'b' }, { 'c', 'd' } }.
Isso vai estar em oElement

Portanto vai colocar em ordem o segundo elemento dele. oElement[ 2 ]

No fonte anterior coloquei o [ 2 ] no lugar errado.

Como ordenar Uma Array dentro de Array?

Enviado: 18 Set 2016 11:01
por clodoaldomonteiro
Amigo Quintas,

Valeu a grande ajuda, mas ficou assim:

Código: Selecionar todos

         ASort( oElement[ 4 ],,, { | a, b | iif( a[ 4 ] == b[ 4 ], a[ 4 ] < b[ 4 ], a[ 4 ] < b[ 4 ] ) } )
Resultado:

Código: Selecionar todos

Param CNPJ....:06553606000130

Param Razao...:PREFEITURA MUNICIPAL DE UNIAO

Param Contador:VALDIR COSTA SABOIA JUNIOR

------------------------------------------------------------------------------------------------------------------------
LISTA DE EMPRESAS LICENCIADAS NESTA MAQUINA - Empresa Contratante por Empresas Licenciadas:
CNPJ                   PERIDO              NOME EMPRESA
------------------------------------------------------------------------------------------------------------------------
CONTRATANTE: 01.613.011/0001-00 - CAMARA MUNICIPAL DE BOM JESUS DO PIAUI
  01.613.011/0001-00 | 2016/01 | 2016/02 | CAMARA MUNICIPAL DE BOM JESUS DO PIAUI
  03.013.580/0001-40 | 2016/01 | 2016/02 | CAMARA MUNICIPAL DE CURRAIS
CONTRATANTE: 10.636.767/0001-65 - CONTAS PUBLICAS LTDA
  02.428.669/0001-04 | 2010/01 | 2012/12 | CAMARA MUNICIPAL DE BELEM DO PIAUI
  01.624.224/0001-37 | 2010/01 | 2012/12 | CAMARA MUNICIPAL DE IPIRANGA DO PIAUI
  07.450.927/0001-72 | 2010/01 | 2012/12 | CAMARA MUNICIPAL DE JAICOS
  86.872.371/0001-89 | 2010/01 | 2015/12 | CAMARA MUNICIPAL DE MARCOLANDIA
  02.308.291/0001-05 | 2010/01 | 2012/12 | CAMARA MUNICIPAL DE MASSAPE DO PIAUI
  35.127.463/0001-01 | 2010/01 | 2012/12 | CAMARA MUNICIPAL DE PADRE MARCOS
  02.470.160/0001-20 | 2010/01 | 2015/12 | CAMARA MUNICIPAL DE PIO IX
CONTRATANTE: 01.120.536/0001-03 - PLANACON CONTABILIDADE SOCIEDADE SIMPLES LTDA
  04.790.594/0001-32 | 2009/12 | 2015/12 | CAMARA MUNCIPAL DE BONFIM DO PIAUI
  41.279.571/0001-94 | 2009/12 | 2015/12 | CAMARA MUNCIPAL DE CAMPO MAIOR
  07.703.465/0001-58 | 2009/12 | 2015/12 | CAMARA MUNICIPAL DE AGUA BRANCA
  05.170.237/0001-34 | 2009/12 | 2015/12 | CAMARA MUNICIPAL DE BAIXA GRANDE
  01.068.707/0001-00 | 2009/12 | 2015/12 | CAMARA MUNICIPAL DE BATALHA
  04.255.856/0001-69 | 2009/12 | 2015/12 | CAMARA MUNICIPAL DE BURITI DOS MONTES
  09.522.029/0001-08 | 2009/12 | 2015/12 | CAMARA MUNICIPAL DE CANAVIEIRA
  01.789.302/0001-53 | 2009/12 | 2015/12 | CAMARA MUNICIPAL DE COCAL DE TELHA
  02.992.134/0001-61 | 2009/12 | 2015/12 | CAMARA MUNICIPAL DE COIVARAS
  63.343.719/0001-45 | 2009/12 | 2015/12 | CAMARA MUNICIPAL DE JARDIM DO MULATO
  01.878.514/0001-07 | 2009/12 | 2015/12 | CAMARA MUNICIPAL DE JUAZEIRO DO PIAUI
  01.658.619/0001-50 | 2009/12 | 2015/12 | CAMARA MUNICIPAL DE LAGOA DO SAO FRANCISCO
  02.217.413/0001-58 | 2009/12 | 2015/12 | CAMARA MUNICIPAL DE LAGOINHA DO PIAUI
  03.226.988/0001-08 | 2009/12 | 2015/12 | CAMARA MUNICIPAL DE MORRO DO CHAPEU DO PIAUI
  35.155.225/0001-00 | 2009/12 | 2015/12 | CAMARA MUNICIPAL DE NOVO ORIENTE
  09.589.367/0001-67 | 2009/12 | 2015/12 | CAMARA MUNICIPAL DE PALMEIRAIS
  01.797.628/0001-22 | 2009/12 | 2015/12 | CAMARA MUNICIPAL DE PORTO ALEGRE DO PIAUI
  10.778.856/0001-46 | 2009/12 | 2015/12 | CONSORCIO INTER DE DESENV DO TERRIT DOS COCAIS
  18.535.065/0001-05 | 2009/12 | 2015/12 | FUNDO MUN PREV LAGOA DO SAO FRANCISCO
  02.439.878/0001-53 | 2009/12 | 2015/12 | FUNDO MUNICIPAL DE SAUDE DE COCAL DE TELHA
  15.237.479/0001-51 | 2009/12 | 2015/12 | PEDRO II-PREV-FUNDO PREVIDENCIARIO DO MUNICIPIO DE PEDRO II
  06.554.059/0001-08 | 2009/12 | 2015/12 | PREFEITURA ELIZEU MARTINS
  06.554.760/0001-27 | 2009/12 | 2015/12 | PREFEITURA MUNICIPAL DE AGUA BRANCA
  06.554.745/0001-89 | 2009/12 | 2015/12 | PREFEITURA MUNICIPAL DE BARRO DURO
CONTRATANTE: 06.554.786/0001-75 - PREFEITURA MUNICIPAL DE JOSE DE FREITAS EDUCACAO
  06.554.786/0001-75 | 2016/01 | 2016/03 | PREFEITURA MUNICIPAL DE JOSE DE FREITAS EDUCACAO
  06.554.786/0002-56 | 2016/01 | 2016/05 | SEC SAUDE E BEM ESTAR SOCIAL DE JOSE DE FREITAS
CONTRATANTE: 06.553.606/0001-30 - PREFEITURA MUNICIPAL DE UNIAO
  08.598.892/0001-86 | 2013/12 | 2014/08 | INST DE BENEFICIOS E ASSIST AOS SERVIDORES MUN DE UNIAO
  06.553.606/0001-30 | 2012/12 | 2013/12 | PREFEITURA MUNICIPAL DE UNIAO
  00.783.827/0001-19 | 2012/12 | 2013/12 | SECRETARIA MUN SAUDE UNIAO
CONTRATANTE: 05.738.850/0001-05 - SIC - SERVICOS E INFORMACOES E CONTABEIS LTDA
  01.614.104/0001-59 | 2015/01 | 2015/05 | CAMARA MUNICIPAL DE ALAGOINHA DO PIAUI
  07.173.257/0001-94 | 2012/12 | 2013/12 | CAMARA MUNICIPAL DE AROEIRAS DO ITAIM
  03.034.256/0001-08 | 2012/12 | 2013/12 | CAMARA MUNICIPAL DE FLORESTA DO PIAUI
  00.860.058/0001-05 | 2012/12 | 2013/12 | CAMARA MUNICIPAL DE FRANCISCO SANTOS
  05.497.329/0001-23 | 2012/12 | 2013/12 | CAMARA MUNICIPAL DE GEMINIANO
Repare que as empresas Contratantes tem uma lista de empresas licenciadas.

Como ordenar Uma Array dentro de Array?

Enviado: 18 Set 2016 12:05
por JoséQuintas
Prefeitura...
Precisava de uma boquinha dessas.... rs
Não pra sacanagem.
É que sempre envolve vários usuários, muito mais do que uma empresa comum, e o valor costuma ser proporcional.

Como ordenar Uma Array dentro de Array?

Enviado: 18 Set 2016 12:11
por JoséQuintas
Comentário:

Seu teclado deve estar parecido com o meu, corrija "PERIDO"

E pelo jeito seu array não é mais o mesmo... rs
Mas deu pra perceber pelas colunas do relatório, que elas devem fazer parte do novo array.

Como ordenar Uma Array dentro de Array?

Enviado: 19 Set 2016 09:54
por sambomb

Código: Selecionar todos

aArray:={;
  {'1', {'A', 'B'} },;
  {'7', {'C', 'A'} },;
  {'5', {'M', 'E'} },;
  {'0', {'E', '2'} };
}

aArray := aSort(aArray,{|X,Y| X[1] + X[2,1] + X[2,2] < Y[1] + Y[2,1] + Y[2,2] })


Como ordenar Uma Array dentro de Array?

Enviado: 19 Set 2016 13:35
por clodoaldomonteiro
Valeu a dica de todos,

Mas Sambomb, sua resposta não deu certo, logo tenho que ordenar, segundo seu exemplo, a segunda coluna de aArray, que é uma Array simples.

No meu caso, a coluna que é uma Array tem vários elementos, variando de caso em caso.

Como já falei antes, seria como esse exemplo:

Código: Selecionar todos

//Esta matriz não está ordenada corretamente.
aArray:=
{;
    {'Setor 1', { {'Araujo', 'Bruno'} ,{'Alves', 'Carla'},{'Gomes', 'Antonio'} } },;
    {'Setor 7', { {'Castro', 'Antonio'},{'Monteiro', 'Francisco'}} },;
    {'Setor 5', { {'Gomes', 'Karol'}, {'Frazao', 'Carlos'}, {'Quintas', 'José'}, {'Toledo', 'Paulo'}} },;
    {'Setor 0', { {'Silva', 'Luiz'}, {'Sousa', 'Mariza'}} };
 }

//Esta matriz ordenada corretamente. A segunda coluna da matriz geral está ordenada por sobrenome, tendo uma ordenação independente da matriz geral.
aArray:=
{;
    {'Setor 0', { {'Silva', 'Luiz'}, {'Sousa', 'Mariza'} } },;
    {'Setor 1', { {'Alves', 'Carla'}, {'Araujo', 'Bruno'}, {'Gomes', 'Antonio'} } },;
    {'Setor 5', { {'Frazao', 'Carlos'}, {'Gomes', 'Karol'}, {'Quintas', 'José'}, {'Toledo', 'Paulo'} } },;
    {'Setor 7', { {'Castro', 'Antonio'}, {'Monteiro', 'Francisco'} } };
 } 
Quintas, valeu a dica do erro gramatical, é a pressa que me deixa assim. E quanto às Prefeituras aqui no Piauí, a coisa tá muito feia, kakakaka