Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi 2 Stringlisten vergleichen, geht es besser? (https://www.delphipraxis.net/58403-2-stringlisten-vergleichen-geht-es-besser.html)

lucius 6. Dez 2005 16:04


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:
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;
Hiermit vergleiche ich also die StringListe(slBase) mit der StringListe(slNeu), jetzt meine Frage ist meine Vorgehensweise ok oder habt ihr Verbesserungsvorschlaege?
Dank im voraus.

MFG Lucius.

shmia 6. Dez 2005 16:13

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: http://www.delphipraxis.net/internal...ct.php?t=23230

lucius 6. Dez 2005 17:02

Re: 2 Stringlisten vergleichen, geht es besser?
 
Ich werde mich das mal naeher anschauen shmia, Danke fuer den Hint.

Gruss Lucius.

marabu 6. Dez 2005 17:48

Re: 2 Stringlisten vergleichen, geht es besser?
 
Hallo Lucius,

der von dir gezeigte Code könnte auch so aussehen:

Delphi-Quellcode:
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;
Grüße vom marabu

Der_Unwissende 6. Dez 2005 18:06

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

lucius 6. Dez 2005 18:21

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.

lucius 6. Dez 2005 18:22

Re: 2 Stringlisten vergleichen, geht es besser?
 
Habs schon marabu,
Delphi-Quellcode:
var
ss : TStrings; //muss TStringList sein//

marabu 6. Dez 2005 19:17

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

Der_Unwissende 6. Dez 2005 20:09

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

marabu 6. Dez 2005 20:38

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

lucius 7. Dez 2005 17:02

Re: 2 Stringlisten vergleichen, geht es besser?
 
Ich benutze momentan den Code von marabu,

Jetzt wollte ich den mal etwas ausbreiten, denn ich habe naemlich bemerkt das es auch mal vorkommen kann das ein Item in der RSS auf den Server eingefuegt wurde aber auch wieder rausgenommen wurde nachdem der Update ausgefuehrt wurde, hierdurch ist die StringListe (s) nicht mehr aktuell und muss das Item wieder aus s entfernt werden.
Wie stelle ich das an, dies zu realisieren ich habe da schon was im Kopf aber es muesste doch auch mit marabu`s Code gehen oder ?

MFG, Lucius.

alzaimar 7. Dez 2005 18:31

Re: 2 Stringlisten vergleichen, geht es besser?
 
Nur so, zur Info: Ich habe mal diverse Listenstrukturen (Bäume, Hashtabellen, StringList, Skiplist etc.) miteinander verglichen:
Vergleich von Listenstrukturen

marabu 7. Dez 2005 19:33

Re: 2 Stringlisten vergleichen, geht es besser?
 
Hallo Lucius,

Zitat:

Zitat von lucius
Wie stelle ich das an, dies zu realisieren ich habe da schon was im Kopf aber es muesste doch auch mit marabu`s Code gehen oder?

eigentlich nicht, aber hatten wir beide das Problem nicht schon einmal (NForce) gelöst?

Grüße vom marabu

lucius 7. Dez 2005 22:24

Re: 2 Stringlisten vergleichen, geht es besser?
 
Stimmt marabu, ich werde mich gleich mal darin vertiefen.

Gruss Lucius.


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:38 Uhr.

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