Como ordenar Uma Array dentro de Array?

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:

Como ordenar Uma Array dentro de Array?

Mensagem 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.
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: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Como ordenar Uma Array dentro de Array?

Mensagem 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
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, 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: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Como ordenar Uma Array dentro de Array?

Mensagem 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
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, 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: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Como ordenar Uma Array dentro de Array?

Mensagem 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
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, 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:

Como ordenar Uma Array dentro de Array?

Mensagem 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.
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: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Como ordenar Uma Array dentro de Array?

Mensagem 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
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, 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: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Como ordenar Uma Array dentro de Array?

Mensagem 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.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, 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:

Como ordenar Uma Array dentro de Array?

Mensagem 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.
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: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Como ordenar Uma Array dentro de Array?

Mensagem 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.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, 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: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Como ordenar Uma Array dentro de Array?

Mensagem 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.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, 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/
sambomb
Usuário Nível 3
Usuário Nível 3
Mensagens: 250
Registrado em: 24 Out 2008 17:02
Localização: Itaocara - RJ - Brasil

Como ordenar Uma Array dentro de Array?

Mensagem 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] })

Imagem

Rca Sistemas - Itaocara - RJ
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:

Como ordenar Uma Array dentro de Array?

Mensagem 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
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
Responder