Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Duplikate in Stringlist (https://www.delphipraxis.net/153100-duplikate-stringlist.html)

youuu 20. Jul 2010 20:36

Duplikate in Stringlist
 
Hi, ich benutze diesen Algorithmus um Duplikate in einer Stringlist zu löschen, allerdings braucht dieser extrem lange bei 100.000 Einträgen und mehr.

Kennt jemand einen schnelleren?

Delphi-Quellcode:
procedure KillDuplicates(s: TStrings);
var
  iLow, iHigh: integer;
begin
  for iLow := 0 to s.Count - 1 do
    for iHigh := Pred(s.Count) downto Succ(iLow) do
      if s[iLow] = s[iHigh] then
        s.Delete(iHigh);
end;

Klaus01 20. Jul 2010 20:40

AW: Duplikate in Stringlist
 
Guten Abend,

darst Du die Liste sortieren, oder sollen
alle Einträge in der Reihenfolge beibehalten werden?

Grüße
Klaus

mkinzler 20. Jul 2010 20:42

AW: Duplikate in Stringlist
 
Besser wäre es das Einfügen von doppelten Einträgen zu verhindern.

youuu 20. Jul 2010 20:42

AW: Duplikate in Stringlist
 
Darfst Sortiert werden

Klaus01 20. Jul 2010 20:43

AW: Duplikate in Stringlist
 
Zitat:

Zitat von mkinzler (Beitrag 1036494)
Besser wäre es das Einfügen von doppelten Einträgen zu verhindern.

.. darauf wollte ich hinaus.

Zitat:

Class
TStringList

Syntax


Delphi-Quellcode:
 property Duplicates: TDuplicates read FDuplicates write FDuplicates;

Description
Set Duplicates to specify what should happen when an attempt is made to add a duplicate string to a sorted list. The CaseSensitive property controls whether two strings are considered duplicates if they are identical except for differences in case.

The value of Duplicates should be one of the following.
Value Meaning
dupIgnore
Ignore attempts to add duplicate strings to the list.

dupError
raise an EStringListError exception when an attempt is made to add duplicate strings to the sorted list.

dupAccept
Permit duplicate strings in the sorted list.


Set Duplicates before adding any strings to the list. Setting Duplicates to dupIgnore or dupError does nothing about duplicate strings that are already in the list.
Note:
Duplicates does nothing if the list is not sorted.

Grüße
Klaus

youuu 20. Jul 2010 20:44

AW: Duplikate in Stringlist
 
Wenn ich das mache Mkinzler, dann muss ich doch bei jeden Eintrag neu abfragen, ob dieser in der Liste existiert oder nicht, dann geht die Bearbeitungszeit ebenfalls nach oben, bei 100.000 und mehr Einträgen.

Oder versteh ich das falsch?

mkinzler 20. Jul 2010 20:45

AW: Duplikate in Stringlist
 
Ja, den eine Tlist hat diese Funktionalität schon (siehe Beitrag von Klaus)

youuu 20. Jul 2010 20:47

AW: Duplikate in Stringlist
 
Ah so?

StringList.Duplicates := dupError;
Und dann mit Except anfangen?

mkinzler 20. Jul 2010 20:48

AW: Duplikate in Stringlist
 
dupIgnore wäre besser

Matze 20. Jul 2010 20:48

AW: Duplikate in Stringlist
 
Ich glaube, das geht nur in Verbindung mit "Sorted" oder?

Das funktioniert:
Delphi-Quellcode:
var
  sl: TStringList;
begin
  sl := TStringList.Create;
  try
    sl.Duplicates := dupIgnore;
    sl.Sorted := true;

    sl.Add('a');
    sl.Add('b');
    sl.Add('a');

    ShowMessage(sl.Text);
  finally
    FreeAndNil(sl);
  end;
end;
Ohne "Sorted := true;" geht es nicht.

Nachtrag: Ah, das steht in Klaus' Zitat am Ende, sehe ich gerade "Duplicates does nothing if the list is not sorted." :wall:


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:38 Uhr.
Seite 1 von 3  1 23      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz