![]() |
2 Stringlisten vergleichen, geht es besser?
Hallo Leute,
Brauche mal euere Meinung, also ich habe 3 Stringlisten, slBase, slTemp und slNeu, die werden als folgt verarbeitet.
Delphi-Quellcode:
slBase := TStringList.Create;
.... slBase.LoadFromFile('C:\Test\Base.db'); //DBase mit allen Items Laden// ....
Delphi-Quellcode:
slNeu := TStringList.Create;
.... for i:=0 to simplerss.Items.count -1 do begin slNeu.Add(SimpleRSS.Items.Items[i].Title); //20 neue Items laden// end; ....
Delphi-Quellcode:
Hiermit vergleiche ich also die StringListe(slBase) mit der StringListe(slNeu), jetzt meine Frage ist meine Vorgehensweise ok oder habt ihr Verbesserungsvorschlaege?
slTemp := TStringList.Create;
.... for j := 0 to slNeu.Count -1 do begin if not slBase.IndexOf(slNeu.Strings[j]) > -1 then //slNeu String nicht in slBase vorhanden?// slTemp.Add(slNeu.Strings[j]); //Dann String in slTemp einfuegen// end; .... if slTemp.Text <> '' then //Wenn slTemp nicht leer ist// begin for k := slTemp.Count -1 downto 0 do begin slBase.Insert(0, slTemp.Strings[k]); //String in slBase einfuegen// .... slBase.SaveToFile('c:\Test\Base.db');//Neue DBase speichern// //////////////////////Alles freigeben/////////////////////////////////// slBase.Free; slNeu.Free; slTemp.Free; Dank im voraus. MFG Lucius. |
Re: 2 Stringlisten vergleichen, geht es besser?
Wenn du 2 Stringlisten hast, dann brauchst du nur die Mengenlehre anwenden.
Schnittmenge, Vereinigungsmenge, ... Kuckst du in der Code-Library: ![]() |
Re: 2 Stringlisten vergleichen, geht es besser?
Ich werde mich das mal naeher anschauen shmia, Danke fuer den Hint.
Gruss Lucius. |
Re: 2 Stringlisten vergleichen, geht es besser?
Hallo Lucius,
der von dir gezeigte Code könnte auch so aussehen:
Delphi-Quellcode:
Grüße vom marabu
var
i, iNew: integer; s, ss: TStrings; begin // chronological list s := TStringList.Create; s.LoadFromFile(fileName); // alpha list ss := TStringList.Create; ss.Assign(s); TStringList(ss).Sorted := true; // edit: missing cast // count new items iNew := 0; for i := 0 to Pred(SimpleRSS.Items.Count) do // binary search if ss.IndexOf(SimpleRSS.Items[i].Title) = -1 then begin // add new item preserving order s.Insert(iNew, SimpleRSS.Items[i].Title); Inc(iNew); end; // ... s.SaveToFile(fileName); s.Free; ss.Free; end; |
Re: 2 Stringlisten vergleichen, geht es besser?
Hi,
insbesondere wenn du die Liste sortierst (was ich dir auch raten würde) solltest du es ruhig mit der THashedStringList versuchen. Ist natürlich auch von TStrings abgeleitet, aber um einiges Perfomanter (für solche Aufgaben) als eine "normale" TStringList Gruß Der Unwissende |
Re: 2 Stringlisten vergleichen, geht es besser?
Hi marabu, schoener Code aber es gibt ein kleines Problem.
Er kennt ss.Sorted := true nicht. Auch dir Der_Unwissende danke fuer dein Tip. Gruss Lucius. |
Re: 2 Stringlisten vergleichen, geht es besser?
Habs schon marabu,
Delphi-Quellcode:
var
ss : TStrings; //muss TStringList sein// |
Re: 2 Stringlisten vergleichen, geht es besser?
Sorry Lucius, wollte dich nicht ärgern.
Unwissender, es widerstrebt mir dich so zu addressieren, da ich schon einige gute Beiträge von dir gelesen habe. Die HashedStringList kann im vorliegenden Fall ihre Stärke nicht ausspielen. Bei 20 Zugriffen pro Durchlauf auf eine Liste mit einem item count von 1000 und einer Wachstumsrate von geschätzten 10 items pro Tag wächst die Zugriffszeit der Hash-Funktion um ein Vielfaches schneller als beim Binary Search (100:1 und schlechter). Wenn man die HashedStringList richtig einsetzt kann man viel Freude daran haben. Freundliche Grüße vom marabu |
Re: 2 Stringlisten vergleichen, geht es besser?
@marabu Danke, mit deinem Absender ehrt mich ein solcher Kommentar (nichts gegen andere die das schon sagten), aber schon allein weil ich viel zu faul bin mir einen anderen Namen zu überlegen bleibe ich trotzdem bei diesem.
Ok, hätte wohl auf die Wachstumrate achten sollen. Mit meinem Unwissenden Bonus stell ich jetzt aber mal die Frage ob du weißt wie THashedStringList intern arbeitet? (Gut, könnte in den Sourcen suchen) Wenn Delphi die THashedStringlist nur sinnvoll genug anlegt, dann ist dann muss das Feld selten neu angelegt werden und ein Key-Clash wird natürlich unwahrscheinlicher (mal schauen ob ich nicht doch meinen Namen zu Recht trage). Aber natürlich geb' ich dir Recht, es lohnt sich nicht immer Hashes zu benutzen (und bei der Wachstumsrate, hm). Gruß und frohen Nikolaus :wink: Der Unwissende |
Re: 2 Stringlisten vergleichen, geht es besser?
Die Macher der HashedStringList haben sich für 256 (fixed) Buckets (einfach verkettete Listen) entschieden, die Hash-Funktion schiebt die Zeichen des Schlüssels per XOR durch ein rotierendes 32-bit Register.
marabu |
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:27 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz