Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Delphi TstringList und TRegex.isMatch (https://www.delphipraxis.net/186979-tstringlist-und-tregex-ismatch.html)

ScharfeMietze 19. Okt 2015 01:47


TstringList und TRegex.isMatch
 
Die Frage was ist smarter bei einer TsringList mit x tausend einträgen.
Ein Schleifendurchlauf mit for I = 0 to TstringList count -1 und Tregex.isMatch. oder TRegex.Ismatch(Tstringlist.text.....);
Da auch mal bis zu 20k Einträge kommen können wüste ich das gerne.

Gruß
SM:-D

Lemmy 19. Okt 2015 05:31

AW: TstringList und TRegex.isMatch
 
Hallo,

eine Suche wird dann schneller wenn Du nicht mehr alle 20k Einträge durchsuchen musst. Mit TRegEx wird der Vergleich an sich ja komplexer - daher würde ich vermuten, dass das am Ende nicht schneller ist.

Entweder du kannst über die THasedStringList was erreichen oder wenn Du die StringList sortieren kannst über binäre Suche die Anzahl der Vergleiche eingrenzen.

Sir Rufo 19. Okt 2015 06:26

AW: TstringList und TRegex.isMatch
 
Eine simple Zeitmessung für Variante A und B würde doch Erkenntnisse liefern ... so mache ich das immer

Dejan Vu 19. Okt 2015 06:51

AW: TstringList und TRegex.isMatch
 
Zitat:

Zitat von Lemmy (Beitrag 1319021)
Hallo,

eine Suche wird dann schneller wenn Du nicht mehr alle 20k Einträge durchsuchen musst. Mit TRegEx wird der Vergleich an sich ja komplexer - daher würde ich vermuten, dass das am Ende nicht schneller ist.

Es kommt auf die Implementierung in RegEx an.

Aber einfach nur Sortieren oder gar eine Hashmap bringen hier gar nichts, denn es geht um pattern matching und nicht um einfachen Vergleich von Strings.

Uwe Raabe 19. Okt 2015 07:09

AW: TstringList und TRegex.isMatch
 
Ein Aufruf von TStringList.Text iteriert doch über alle Elemente und setzt die mit Zeilenumbruch aneinander. Das RegEx muss auch den Text von vorne bis hinten durchgehen, dauert also vermutlich proportional zur Textlänge. Debuggen lässt es sich bestimmt leichter in der ersten Version.

Lemmy 19. Okt 2015 07:18

AW: TstringList und TRegex.isMatch
 
Zitat:

Zitat von Dejan Vu (Beitrag 1319025)
Aber einfach nur Sortieren oder gar eine Hashmap bringen hier gar nichts, denn es geht um pattern matching und nicht um einfachen Vergleich von Strings.

hast recht, das erste Regex habe ich glatt überlesen...

ScharfeMietze 19. Okt 2015 10:37

AW: TstringList und TRegex.isMatch
 
Leider kann ich (vorab) nicht Testen, da ich die originalen Datensätze nicht habe.
Ich hatte auch auf eine eindeutigere Antwort gehofft.
Was aber wiederum auch nicht unbedingt schlecht ist wenn es keine Eindeutige Antwort gibt, da dann keine 10 Sekunden unterschied zu erwarten sind ^^

nahpets 19. Okt 2015 11:04

AW: TstringList und TRegex.isMatch
 
Hallo,

mir ist bei der Fragestellung nicht ganz klar, was Du als Ergebnis erwartest?

Kommt eine Zeichenfolge... irgendwo in der Stringliste vor

oder

In welcher Zeile der Stringliste kommt eine Zeichenfolge... vor?

Vermutlich ersteres?

Mein Erfahrung bei der Arbeit mit Stringlisten mit größerem Inhalt (mehrere MB Text in einer mehr oder weniger großen Anzahl von Zeilen):

Das Ersetzen von Zeichenfolgen via AnsiReplaceText... ist bei einer zeilenweisen Verarbeitung deutlich schneller, als eine Ersetzung über "Stringliste.Text".

Ob sich TRegex.isMatch ähnlich verhält, kann ich (mangels Erfahrung) nicht sagen.

ScharfeMietze 25. Okt 2015 11:24

AW: TstringList und TRegex.isMatch
 
Es geht um eine Art Index der Inhalt eines Editfeldes wird mit dem Index abgeglichen. Wenn vorhanden verwerfe Inhalt des Tabsheets wenn nicht vorhanden füge es dem Index hinzu und arbeite dioutinen ab.
Ich mache momentan den Probelauf mit der Regex Variante schau mer mal.
Grüße SM

nahpets 25. Okt 2015 16:40

AW: TstringList und TRegex.isMatch
 
Hallo,

unter 'nem Index stelle ich mir sowas vor:
Code:
Aladin
Benjamin
Carolin
...
Yvonne
Zacharias
Ist Dein Index in der Art aufgebaut?
Wenn ja, dann versuche es doch mal mit
Delphi-Quellcode:
if StringListe.IndexOf(Editfeld.Text) < 0 then begin
  StringListe.Add(Editfeld.Text);
end else begin
  VerwerfeInhaltDesTabsheets;
end;
Die Stringliste muss dafür nicht sortiert sein.


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:07 Uhr.
Seite 1 von 2  1 2      

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