Ver Mensaje Individual
  #29  
Antiguo 14-04-2018
bucanero bucanero is offline
Miembro
 
Registrado: nov 2013
Ubicación: Almería, España
Posts: 208
Reputación: 11
bucanero Va camino a la fama
Hola,

este ejemplo esta completo y funcional, contiene dos listas con combinaciones:
Código Delphi [-]
unit Unit1;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls;

type
  { TForm1 }
  TForm1 = class(TForm)
    Button1: TButton;
    ListBox1: TListBox;
    ListBox2: TListBox;
    Memo1: TMemo;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private
    list:TStringList;
    function GetComb(listBox:TListBox):String;
    procedure buscarComunes(const Cad1:Int64);
    function  extraerComunes(const res:int64):string;
    procedure CompararCombinaciones(const Cad1, cad2:Int64);
  public

  end;

var
  Form1: TForm1;

implementation

{$R *.lfm}

{ TForm1 }

procedure TForm1.FormCreate(Sender: TObject);
begin
  //inicio del proceso
  // poner esto al principio del proceso fuera de todos los bucles
  list:=TStringList.create;
  list.delimiter:=' ';

  With listbox1, items do begin
    add('10 12 21 33 45');
    add('10 13 23 34 45');
    add('16 33 14 27 10'); //<-- da lo mismo el orden de los elementos
  end;

  With listbox2, items do begin
    add('10 11 20 33 45');
    add('2 20 22 34 44');
  end;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  // al final del proceso
  list.free; //liberar el objeto
end;

function ValorCombinacion(list:TStrings):Int64;
var
  elemento:Byte;
  i: Integer;
begin
  result := 0;
  with list do
    for i := 0 to Count - 1 do begin
      //se obtiene el valor numerico de la lista
      elemento := StrToInt(strings[i])-1;
      //se inserta en el resultado
      result := result or (Int64(1) shl elemento);
    end;
end;
function  TForm1.GetComb(listBox:TListBox):String;
begin
  result:=listBox.items[listBox.itemIndex];
end;

function  TForm1.extraerComunes(const res:int64):string;
var
  i:integer;
begin
  result:='';
  for i :=0 to 49 do
    if ((res and (int64(1) shl i))<>0) then
      result:=result+IntToStr(i+1)+' ';
end;
procedure TForm1.CompararCombinaciones(const Cad1, cad2:Int64);
var
  res:Int64;
  comunes:string;
begin
  res:=cad1 and cad2;
  if (cad1 = cad2) then begin
    // las dos combinaciones son iguales
  end
  else if (res <> 0) then begin
    // coinciden algunos elementos y en particular los elementos que coinciden
    // son aquellos cuya posición de bit esta puesta a 1
    //para saber los elementos que son comunes recorres bit a bit la variable RES
    comunes:=extraerComunes(res);
    // mostrar resultados
    Memo1.lines.add(GetComb(listbox1)+#9+GetComb(listbox2)+#9+'->'+#9+comunes);
  end
  else begin
    // las dos combinaciones son totalmente distintas
  end;
end;
procedure TForm1.buscarComunes(const Cad1:Int64);
var
  cad2:Int64;
  j:integer;
begin
  // Recorro la lista2
   with listbox2 do
   for j := 0 to Count -1 do
   begin
     ItemIndex := j;
     //convierto el string separado por espacios a una lista
     list.delimitedText:=Items[j];
     // Calculo CAD2 cada vez que cambia el indice de per
     cad2 := ValorCombinacion(list);
     CompararCombinaciones(cad1, cad2);
   end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  cad1:Int64;
  i:integer;
begin
  //Recorro la lista1
  with ListBox1 do
    for i := 0 to Count -1 do
    begin
      // Calculo CAD1 cada vez que cambia el indice de lista3
      ItemIndex := i;
      //convierto el string separado por espacios a una lista
      list.delimitedText:=Items[i];
      cad1:= ValorCombinacion(list);
      buscarComunes(cad1);
    end;
end;

end.
Responder Con Cita