![]() |
Re: schnellere Alternative zu StringListe.IndexOf() gesucht
Danke!
Werd ich morgen mal ausprobieren! |
Re: schnellere Alternative zu StringListe.IndexOf() gesucht
Habe ich was überlesen, oder wurde sortiert einfügen noch nicht vorgeschlagen? Ein schlanker Binary-Search vorm Einfügen erschlägt 2 Fliegen mit einer Klappe: Entweder wird der Eintrag gefunden (-> Duplikat), oder du bekommst gleich den Index zurück, an dem einzufügen ist um die Liste sortiert zu halten, was nachfolgende binäre Suchen möglich macht.
Edit: Und das ganze mit einer Worst-Case Komplexität von O(log(n)) pro Eintragungsversuch. |
Re: schnellere Alternative zu StringListe.IndexOf() gesucht
Zitat:
Delphi-Quellcode:
erfüllt den gleichen Zweck. Er will aber nach seinen eigenen Regeln sortieren.
StringList.Sorted := True;
StringList.Duplicates := dupIgnore; |
Re: schnellere Alternative zu StringListe.IndexOf() gesucht
Wurde mehrfach vorgeschlagen, aber wollte er erst nicht nehmen, weil er seine Liste nicht extra zweimal umsortieren wollte, da sie schon "anders" sortiert ist (CustomSort).
|
Re: schnellere Alternative zu StringListe.IndexOf() gesucht
Okay, dann ist mir entgangen, dass die ursprüngliche Sortierung beibehalten werden muss. Scusi :)
|
Re: schnellere Alternative zu StringListe.IndexOf() gesucht
Wie ist es, wenn man die immerhin 6000 Strings in einem Clientdataset speichert ? Dann könnte man dies indizieren und mit Locate suchen.
Könnte schneller sein, sicher bin ich mir aber nicht. Gruß Ralf |
Re: schnellere Alternative zu StringListe.IndexOf() gesucht
bei 6000 Zeilen lohnt sich schon ne kleine Datenbank. Access z.B. wird sich darin viel viel schneller zurecht finden als du mit Delphi und Stringvergleichen.
Bernhard |
Re: schnellere Alternative zu StringListe.IndexOf() gesucht
Und wie groß wäre der Aufwand den Stringlisteninhalt in die DB und nach den Einfügeaktionen wieder da rauszuholen, wenn es doch reichen würde der Stringliste einfach nur das gewünschte Sortierverfahren beizubringen, welches dann die schnelleren Suchfunktionen der Stringliste nutzbar macht?
|
Re: schnellere Alternative zu StringListe.IndexOf() gesucht
6000 Strings sind doch ruckizucki da rein-SQL-t. Das muss ja wenn überhaupt nur ein Mal gemacht werden, und auch nur, wenn schon eine bestehende Liste übernommen werden muss. Die Einfügeoperation pro weiterem String dürfte durch die optimierten Suchstrategien in den meisten DBMS sehr schnell aufgewogen, und ab einem gewissen Punkt unterboten werden. Die Idee ist nicht wirklich schlecht, auch wenn es im ersten Moment wie Kanone->Spatz anmutet.
Edit: Vor allem besticht der geringe Implementierungsaufwand durch Benutzung bestehender Dinge sehr. |
Re: schnellere Alternative zu StringListe.IndexOf() gesucht
Hallo,
danke für die Antworten! Aber eine Datenbank find ich dafür ein wenig übertrieben. Ich versuche jetzt gerade himitsu´s Vorschlag in die Tat umzusetzen, aber ich scheitere an der Vergleichs-function. Zitat:
Delphi-Quellcode:
anfangen.
function TNaturalStringList.CompareStrings(const S1, S2: string): Integer;
Momentan ruf ich so eine Sortierroutine so auf:
Delphi-Quellcode:
Wobei "Compare_NaturalSort" so
StringList_MN.CustomSort(Compare_NaturalSort);
Delphi-Quellcode:
ausschaut. Und nun weiss ich leider nicht wie ich das in die obere function einfügen soll.
function Compare_NaturalSort(List: TStringList; Index1, Index2: Integer): Integer;
begin //Natürlich sortieren (Nummern aufsteigend) //benötigt "StrNatComp.pas" Result := StrNatCompare(List[Index1], List[Index2]); end; (Ich muss dazusagen, dass die Sortierroutine nicht von mir ist, sondern aus dem I-Netz) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:33 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