Delphi-PRAXiS
Seite 2 von 3     12 3      

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:50

AW: Duplikate in Stringlist
 
Super danke

mkinzler 20. Jul 2010 20:51

AW: Duplikate in Stringlist
 
Ja, das steht aber auch schon in Klaus' Beitrag
Alternativ könnte man mit .IndexOf() auf Vorhandensein prüfen; ist aber langsamer funktioniert aber auch unsortiert

fatalerror 20. Jul 2010 21:16

AW: Duplikate in Stringlist
 
Wenn in einer Liste aber bereits vorhandene Duplikate stehen (so wie im ursprünglichen Posting angegeben) würde ich die Liste kopieren, dies sollte bedeutend schneller gehen als das Prüfen mit deiner Routine:

Nur so hingetippt ohne zu überprüfen obs auch funktioniert

Delphi-Quellcode:
var
sl1, sl2:TSTringlist;
i:Integer;
t_start, t_stop:integer;

iLow, iHigh: integer;

begin
sl1:= Tstringlist.Create;
sl2:=TStringlist.Create;

try
  sl1.loadfromFile('c:\temp\testfîle.lst'); //laden einer Stringliste

  //Variante mit neuer Stringliste
  sl2.Duplicates:= dupignore;
  sl2.Sorted:=true;

  t_start := gettickcount;
  sl2.Assign(Sl1); //Einträge der zweiten Stringliste zuordnen
  t_stop := gettickcount;
  showmessage('Variante1; ' +inttostr(t_stop - t_start)+  ' ms');

  //Variante2 kopiert aus dem Originalposting

  t_start := gettickcount;
  for iLow := 0 to sl1.Count - 2 do
    for iHigh := Pred(sl1.Count) downto Succ(iLow) do
      if sl1[iLow] = sl1[iHigh] then
        sl1.Delete(iHigh);

  t_stop := gettickcount;
  showmessage('Variante2: ' +inttostr(t_stop - t_start)+  ' ms');

finally
 sl1.Free;
 sl2.Free;

end;

alzaimar 20. Jul 2010 21:36

AW: Duplikate in Stringlist
 
Eine Hashmap prüft das Vorhandensein eines Strings wesentlich effektiver, als das in der TStringList eingebaute 'Duplicates'. Beim Einfügen dürfte das die bei weitem schnellste Möglichkeit sein.

Du kannst Dir auch die THashedStringList aus der Unit 'IniFiles' nehmen, die hier vielleicht auch schnell genug sein könnte.

youuu 21. Jul 2010 10:09

AW: Duplikate in Stringlist
 
Habe noch eine Frage.

Ich hab nun 2 Stringlisten.

1. Duplikate die nicht in die neue Strinlit aufgenommen werden soll
und
2. die neue Stringlist.

Delphi-Quellcode:
        Try
          sOld.Duplicates := dupError;
          sOld.Sorted := true;

          sOld.Add(url); // Abgleich Stringlist
          s.Add(url); // Neu Link Stringlist
        except
          on EStringListError do    

        end;
Habe also "sOld" = Duplikate die nicht in die neue Stringlist "s" aufgenommen werden sollen.
Allerdings funktioniert das auch, jedoch statt 2 Sekunden, normaler ab Arbeitungszeit, der Procedure nun 9-15 Sekunden, nur durch diesen Codeteil.

mkinzler 21. Jul 2010 10:57

AW: Duplikate in Stringlist
 
Wie gesagt ist es besser dupIgnore zu setzen. Denn so wird ja bei jedem doppelten Vorkommen eine Exception ausgelöst!
dupError benötigst du nur, wenn du auf dies in irgendeiner Form reagieren willst.

Btw.: das mit dem Delphi-Tag statt Code-Tag gilt für alle Beiträge

youuu 21. Jul 2010 11:11

AW: Duplikate in Stringlist
 
Das Problem bei Dupignor ist allerdings nun das ich in der Stinglist "s" keine Einträge aus der Stringlist sOld haben möchte, sowie die duplikate aus der sOld.

Daher hab ich dies mit einer Exception versucht zulösen, da dann ja "s.add()" übersprungen wird sobald in sOld ein Duplikat eingetragen werden sollte.

mkinzler 21. Jul 2010 11:15

AW: Duplikate in Stringlist
 
Rate mal was dupIgnore macht? Oder schau in der Hilfe nach.

youuu 21. Jul 2010 11:20

AW: Duplikate in Stringlist
 
Ich weiß schon was dupignore macht, aber ich habe 2 Stringlisten.

Eine mit duplikaten und eine leere und in der leeren sollen auch keine duplicate aus der 1. eingeführt werden.

Das heißt ich muss ja testen ob ein duplikate in der 1. eingefügt werden sollte, wenn ja füge es nicht in die 2. Liste ein.

Nur weiß ich nicht wie ich das anders als über die exception in Erfahrung bringe.

mkinzler 21. Jul 2010 11:30

AW: Duplikate in Stringlist
 
Delphi-Quellcode:
          if sOld.IndexOf( url) = -1 then
              s.Add(url); // Neu Link Stringlist


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:28 Uhr.
Seite 2 von 3     12 3      

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