Thema: Delphi Listbox vergleichen

Einzelnen Beitrag anzeigen

marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#6

Re: Listbox vergleichen

  Alt 1. Nov 2007, 11:39
Hallo,

als ich die Prozedur IntersectStrings() bereit stellte, habe ich auch auf die Bedeutung einer Sortierung hingewiesen. Auch die Aktualisierung der ListBox wird ja unterdrückt. Ein Test zeigt bei mir Zeiten (für Sortierung und Selektion) jeweils deutlich unter 100 Millisekunden.

Delphi-Quellcode:
function RandomStr(size: integer): string;
var
  i: integer;
begin
  SetLength(Result, size);
  for i := 1 to Length(Result) do
    Result[i] := Chr(Ord('A') + Random(26));
end;

procedure IntersectStrings(sResult, s1, s2: TStrings);
var
  i: Integer;
  s: string;
begin
  sResult.BeginUpdate;
  sResult.Clear;
  for i := 0 to Pred(s2.Count) do
  begin
    s := Copy(s2[i], 1, 7);
    if s1.IndexOf(s) >= 0 then
      sResult.Add(s);
  end;
  sResult.EndUpdate;
end;

procedure TDemoForm.ButtonClick(Sender: TObject);
var
  s: TStringList;
  tc: Cardinal;
begin
  s := TStringList.Create;
  tc := GetTickCount;
  s.Assign(ListBox1.Items);
  ShowMessage(Format('assigned: %d', [GetTickCount - tc]));
  tc := GetTickCount;
  s.Sorted := True;
  ShowMessage(Format('sorted: %d', [GetTickCount - tc]));
  IntersectStrings(ListBox3.Items, s, ListBox2.Items);
  ShowMessage(Format('selected: %d', [GetTickCount - tc]));
  s.Free;
end;

procedure TDemoForm.FormCreate(Sender: TObject);
const
  CNT1 = 10000;
  CNT2 = 2000;
var
  i: Integer;
begin
  with ListBox1.Items do
  begin
    BeginUpdate;
    for i := 1 to CNT1 do
      Add(Format('%.2d-%.4d', [Random(100), Random(10000)]));
    EndUpdate;
  end;

  with ListBox2.Items do
  begin
    BeginUpdate;
    for i := 1 to CNT1 do
      Add(Format('%.2d-%.4d_%s', [Random(100), Random(10000), RandomStr(5)]));
    EndUpdate;
  end;
end;
Ich vermute, dass einfach nicht sortiert worden ist. Sortiert wird die große Liste und diese wird auch als zweiter Parameter übergeben. Die kleinere Liste wird als dritter Parameter übergeben und enthält die Einträge mit angehängtem String.

Grüße vom marabu
  Mit Zitat antworten Zitat