Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Schnelle Wildcart Suche (https://www.delphipraxis.net/205100-schnelle-wildcart-suche.html)

backdraft 31. Jul 2020 10:36

Schnelle Wildcart Suche
 
Hallo zusammen,

ich bin auf der Suche nach einer schnellen Möglichkeit in einer TList<string> zu Suchen.

Das Ganze sollte auch Case Insensitiv möglich sein.

Was wäre der beste Ansatz hierfür?
Gibt es vielleicht was fertiges im aktuellen Delphi?

Klaus01 31. Jul 2020 10:39

AW: Schnelle Wildcart Suche
 
eine Frage warum TList<String> und nicht gleich eine Stringlist?

StringList hat indexOf('test')

Grüße
Klaus

Uwe Raabe 31. Jul 2020 10:40

AW: Schnelle Wildcart Suche
 
Zitat:

Zitat von Klaus01 (Beitrag 1470919)
eine Frage warum TList<String> und nicht gleich eine Stringlist?

StringList hat indexOf('test')

IndexOf kann aber keine Wildcards.

backdraft 31. Jul 2020 10:42

AW: Schnelle Wildcart Suche
 
Es geht mir auch nicht um eine konkrete Lösung zu finden. Die habe ich.
Die ist aber viel zu langsam :-(
Gibt ja genug Beispiele im Netz.

Hier wäre eher die Erfahrung wichtig, was ist am schnellsten?
Was fertiges in Delphi, RegEx, usw.

Uwe Raabe 31. Jul 2020 10:59

AW: Schnelle Wildcart Suche
 
Zitat:

Zitat von backdraft (Beitrag 1470921)
Es geht mir auch nicht um eine konkrete Lösung zu finden. Die habe ich.
Die ist aber viel zu langsam :-(

Dann wäre es hilfreich zu wissen, was du aktuell machst. Sonst bekommst du womöglich dieselbe Antwort nochmal.

backdraft 31. Jul 2020 11:09

AW: Schnelle Wildcart Suche
 
Derzeit Suche ich so:

Code:
function MatchText(const aSubText, aText: string): Boolean;
var
  pSource: PChar;
  pPattern: PChar;

  function _MatchPattern(aElement, aPattern: PChar): Boolean;
  begin
    if 0 = StrComp(aPattern, '*') then
      Result := true
    else if (aElement^ = Chr(0)) and (aPattern^ <> Chr(0)) then
      Result := False
    else if aElement^ = Chr(0) then
      Result := true
    else
      begin
        case aPattern^ of
          '*':
            if _MatchPattern(aElement, @aPattern[1]) then
              Result := true
            else
              Result := _MatchPattern(@aElement[1], aPattern);
          '?':
            Result := _MatchPattern(@aElement[1], @aPattern[1]);
        else
          if aElement^ = aPattern^ then
            Result := _MatchPattern(@aElement[1], @aPattern[1])
          else
            Result := False;
        end;
      end;
  end;

begin
  pSource := PChar(aText);
  pPattern := PChar(aSubText);
  Result := _MatchPattern(pSource, pPattern);
end;

sakura 31. Jul 2020 11:30

AW: Schnelle Wildcart Suche
 
Je nach Komplexität der Maske, TMask (unit System.Masks) ist schon sehr schnell.

...:cat:...

backdraft 19. Aug 2020 16:41

AW: Schnelle Wildcart Suche
 
So, hab mal alles mögliche getestet, mit RegEx gehts am schnellsten, sogar schneller als TMask.
Danke für die Tipps


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:16 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