Fórum Ajuda para comparar os dados de dois memos. #372510

21/07/2009

0

Tudo bem pessoal?? Espero que possam me ajudar com essa dificuldade, ainda estou engatinhando no Delphi...
Estou tentando comparar os dados de dois memos e fazer um terceiro receber uma cópia do segundo com o maior número de dados iguais encontrados em cada linha da pesquisa. Por exemplo:

Memo1 ...................... Memo2
13;17;10;13;27;30 -- 01;02;03;04;05;06
10;09;16;20;21;43 -- 02;03;04;05;06;07
01;02;03;04;05;06 -- 03;04;05;06;07;08
16;18;26;27;34;40 -- 04;05;06;07;08;09

O que gostaria que ele retornasse seria isso:

01;02;03;04;05;06 -> 6
02;03;04;05;06;07 -> 5
03;04;05;06;07;08 -> 4
04;05;06;07;08;09 -> 3

Mas o que estou recebendo como retorno é:

01;02;03;04;05;06 -> 0
02;03;04;05;06;07 -> 0
03;04;05;06;07;08 -> 4
04;05;06;07;08;09 -> 0

Só consegui fazer a comparação da primeira com a primeira e segunda com segunda linha e assim por diante não sei como fazer para comparar a primeira linha do segundo memo com todas do primeiro e dai partir para a segunda...
Se vocês puderem me ajudar... o código está assim:

unit U_Conferir;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TF_Conferir = class(TForm)
    Memo1: TMemo;
    Memo2: TMemo;
    Memo3: TMemo;
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    OpenDialog1: TOpenDialog;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  F_Conferir: TF_Conferir;
  vec,tot: array of integer;
implementation

{$R *.dfm}

function conferir(const a, b: array of integer):integer;
var
contem, x, y: integer;
begin
contem:= 0;
for x:=0 to high(a) do begin
  for y:=0 to high(b) do begin
  if a[x]=b[y] then
  contem:=contem+1
  end;
end;
Result:=contem;
end;

procedure TF_Conferir.FormCreate(Sender: TObject);
begin
 memo1.Lines.Clear;
 memo2.Lines.Clear;
 memo3.Lines.Clear;
end;

procedure TF_Conferir.Button1Click(Sender: TObject);
begin
 if OpenDialog1.execute then
    Memo1.Lines.LoadFromFile(OpenDialog1.filename)
end;

procedure TF_Conferir.Button2Click(Sender: TObject);
begin
  if OpenDialog1.execute then
    Memo2.Lines.LoadFromFile(OpenDialog1.filename)
end;

procedure TF_Conferir.Button3Click(Sender: TObject);
var
x: integer;
 begin
 SetLength(vec,6);
 memo3.Lines.Clear;
 for x:=0 to memo1.lines.Count-1 do begin
  vec[0]:=strtointdef(copy(memo1.Lines.Strings[x],1,2),0);
  vec[1]:=strtointdef(copy(memo1.Lines.Strings[x],4,2),0);
  vec[2]:=strtointdef(copy(memo1.Lines.Strings[x],7,2),0);
  vec[3]:=strtointdef(copy(memo1.Lines.Strings[x],10,2),0);
  vec[4]:=strtointdef(copy(memo1.Lines.Strings[x],13,2),0);
  vec[5]:=strtointdef(copy(memo1.Lines.Strings[x],16,2),0);
  setlength(tot,6);
  tot[0]:=strtointdef(copy(memo2.Lines.Strings[x],1,2),0);
  tot[1]:=strtointdef(copy(memo2.Lines.Strings[x],4,2),0);
  tot[2]:=strtointdef(copy(memo2.Lines.Strings[x],7,2),0);
  tot[3]:=strtointdef(copy(memo2.Lines.Strings[x],10,2),0);
  tot[4]:=strtointdef(copy(memo2.Lines.Strings[x],13,2),0);
  tot[5]:=strtointdef(copy(memo2.Lines.Strings[x],16,2),0);
  Memo3.lines.add(memo2.lines.Strings[x]+´ -> ´+IntToStr(conferir(vec,tot)));
 end;
end;
end.



Willer_sh

Willer_sh

Responder

Posts

21/07/2009

Osocram

Acho que não entendi o que vc quer fazer...
Pq seguindo o que vc escreveu

Memo1 ...................... Memo2
13;17;10;13;27;30 -- 01;02;03;04;05;06
10;09;16;20;21;43 -- 02;03;04;05;06;07
[b]01;02;03;04;05;06 -- 03;04;05;06;07;08[/b]
16;18;26;27;34;40 -- 04;05;06;07;08;09 

somente na terceira linha é que temos repetição
01;02;03;04;05;06 -- 03;04;05;06;07;08
no qual se repetem os numeros 03;04;05;06
então:
Mas o que estou recebendo como retorno é:

01;02;03;04;05;06 -> 0
02;03;04;05;06;07 -> 0
03;04;05;06;07;08 -> 4
04;05;06;07;08;09 -> 0 

isso que vc tem como retorno esta correto.

na sua logica vc esta pegando o primeiro numero a lista um e compara com todos da segunda lista, se achar um igual vc aumenta o contador.


Responder

Gostei + 0

22/07/2009

Willer_sh

Então Osocram, desculpa não consegui passar o que quero direito, é o seguinte, da forma como está eu consigo comparar a primeira linha do memo1 com a primeira do memo2, a segunda com a segunda, terceira com terceira, e assim por diante. O que quero é pegar a primeira linha do memo2 e procurar a com maior número de valores iguais, que seria a terceira com 6 números iguais, se pegasse a quarta linha do memo2 primeiro acharia uma igualdade na segunda linha do memo1 o número 9 depois três os números 04 05 06 na terceira linha, então me retornaria três em vez de um já que é o maior número de termos iguais. Acho que com mais um laço lendo só o memo2 de certo vou tentar... valeu, é isso... obirgado pela atenção...


Responder

Gostei + 0

22/07/2009

Osocram

ahuahua
Eu tive q ler umas 6x este seu ultimo post p enteder.. eu lia entendia, qdo olhava o exemplo via que não tinha entendido...
XD
Mas agora sim fui lendo pedaço por pedaço e ohando o seu exemplo...

Agora entendi.

Na verdade vc quer pegar cada linha do Memo2, e achar em qual linha do memo1 q eles mais se repetem e trazer a qtd.

bom.... agora ta uma correria aqui... mas assim que der vou tentar te ajudar no algoritmo..

Então Osocram, desculpa não consegui passar o que quero direito, é o seguinte, da forma como está eu consigo comparar a primeira linha do memo1 com a primeira do memo2, a segunda com a segunda, terceira com terceira, e assim por diante. O que quero é pegar a primeira linha do memo2 e procurar a com maior número de valores iguais, que seria a terceira com 6 números iguais, se pegasse a quarta linha do memo2 primeiro acharia uma igualdade na segunda linha do memo1 o número 9 depois três os números 04 05 06 na terceira linha, então me retornaria três em vez de um já que é o maior número de termos iguais. Acho que com mais um laço lendo só o memo2 de certo vou tentar... valeu, é isso... obirgado pela atenção...



Responder

Gostei + 0

22/07/2009

Osocram

para te ajudar um pouco


cria um memo3 apenas p teste, adiciona um botao e no Click do botão coloque este codigo

  Memo3.Lines.Delimiter := ´;´;
  Memo3.Lines.DelimitedText := Memo2.Lines[0];

vc vai ver q este comando ele vai pegar uma linha do seu memo2 (a primeira linha), e usando o ´;´ como delimitador vai adicionar no memo3 cada algarismo que vc quer comparar em uma linha, assim vc não precisa ficar se matando p fazer os arrays.

tente bolar uma logica com isso...
Para cada linha do memo2 vc vai ter q comparar com todas as linhas do memo1.


Responder

Gostei + 0

22/07/2009

Willer_sh

Valeu, vou tentar com a sua dica...


Responder

Gostei + 0

28/07/2009

Willer_sh

sem sucesso, ainda, se conseguir resolver posto o resultado, e se alguém tiver outras dicas que possam ajudar por favor... valeu galera!!!


Responder

Gostei + 0

28/07/2009

Willer_sh

sem sucesso, ainda, se conseguir resolver posto o resultado, e se alguém tiver outras dicas que possam ajudar por favor... valeu galera!!!


Responder

Gostei + 0

28/07/2009

Emerson Nascimento

tente com este código:
var
  imemo1, imemo2, islist, ncont, nmaior: integer;
  slinha: string;
  st: TStringList;
begin
  st := TStringList.Create;
  st.Delimiter := ´;´;
  Memo3.Clear; // novo memo que irá receber o resultado

  for imemo2 := 0 to Memo2.Lines.Count - 1 do
  begin
    st.DelimitedText := Memo2.Lines[imemo2];
    nmaior := 0;

    for imemo1 := 0 to Memo1.Lines.Count - 1 do
    begin
      ncont := 0;
      slinha := Memo1.Lines[imemo1];
      for islist := 0 to st.Count - 1 do
        if Pos(st[islist], slinha) > 0 then
          Inc(ncont);

      if ncont > nmaior then nmaior := ncont;
    end;

    // joga o resultado num novo memo
    Memo3.Lines.Add(Memo2.Lines[imemo2]+´ -> ´+inttostr(nmaior));

//    // ou altera o memo 2 e acrescenta o resultado
//    Memo2.Lines[imemo2] := Memo2.Lines[imemo2]+´ -> ´+inttostr(nmaior);
  end;
end;



Responder

Gostei + 0

29/07/2009

Willer_sh

Valeu Emerson funcionando perfeitamente... Muito obrigado mesmo!!!


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar