AW: String in TStringList finden verschnellern?
Zitat:
|
AW: String in TStringList finden verschnellern?
Müssen? War es nicht eher andersherum, wenn Duplikate ausgeschlossen werden sollen, muss Sorted auf true gesetzt werden?
|
AW: String in TStringList finden verschnellern?
Zitat:
Das Zulassen von Duplikaten bei einer sortierten Liste ist allerdings etwas zweischneidig: man weiß nie, welches er beim IndexOf/Find zurückliefert. |
AW: String in TStringList finden verschnellern?
Zitat:
Delphi-Quellcode:
dupError
Gruß K-H |
AW: String in TStringList finden verschnellern?
Zitat:
|
AW: String in TStringList finden verschnellern?
Zitat:
Delphi-Quellcode:
und da es im Create oder anderswo nicht gesetzt wird, entspricht der Standardwert auch dort
TDuplicates = (dupIgnore, dupAccept, dupError);
Delphi-Quellcode:
.
TDuplicates(0) = dupIgnore
|
AW: String in TStringList finden verschnellern?
Unter Delphi 7 erfolgt das Einfügen von Daten mit dieser Routine:
Delphi-Quellcode:
dupIgnore ist der "Normalfall", d. h.: Beim Auftreten von Dubletten werden diese nicht eingefügt. Die Stringliste hat also einen eindeutigen Inhalt.
function TStringList.Add(const S: string): Integer;
begin Result := AddObject(S, nil); end; function TStringList.AddObject(const S: string; AObject: TObject): Integer; begin if not Sorted then Result := FCount else if Find(S, Result) then case Duplicates of dupIgnore: Exit; dupError: Error(@SDuplicateString, 0); end; InsertItem(Result, S, AObject); end; Mit dupError kann man sich aber auch 'nen Fehler ausgeben lassen. Egal welche Wahl man trifft: Sofern Sorted = True, gibt es keine Dubletten in der Stringliste. |
AW: String in TStringList finden verschnellern?
Zitat:
Delphi-Quellcode:
trifft keines der case-Labels zu und der Code springt direkt zum
dupAccept
Delphi-Quellcode:
. Hast du es mal probiert?
InsertItem
|
AW: String in TStringList finden verschnellern?
Upps, Du hast recht.
Da hab' ich wohl mal wieder nur halb gelesen oder nur das gesehen, was ich sehen wollte oder so :-( |
AW: String in TStringList finden verschnellern?
Delphi-Quellcode:
Keinerlei Fehler beim Setzen von Sorted True im Nachhinein, selbst wenn Einträge Doppelt vorhanden sind.
procedure TForm1.Button2Click(Sender: TObject);
var sl: TStringList; begin sl := TStringList.Create; try sl.Sorted := False; sl.Add('123'); sl.Add('456'); sl.Add('123'); ShowMessage('Sorted False:' + sLineBreak + sl.Text); sl.Sorted := True; ShowMessage('Sorted True:' + sLineBreak + sl.Text); finally sl.Free; end; |
AW: String in TStringList finden verschnellern?
Zitat:
Irgendwann muss man sich halt entscheiden ob man duplicate will oder nicht. Wenn ja kann man sorted später setzen, im anderen Fall entweder von Anfang an sorted oder selber prüfen. Dann sind wir wieder am Anfang :-) |
AW: String in TStringList finden verschnellern?
Zitat:
Delphi-Quellcode:
dann hast du alle Daten oder vorher
Liste.Sort;
Delphi-Quellcode:
.
Liste.Sorted:=true;
Und es gibt bestimmt viele Möglichkeiten beides zu kombinieren und möglichst viel Chaos anzurichten. Gruß K-H |
AW: String in TStringList finden verschnellern?
Zitat:
Delphi-Quellcode:
wird auch nur beim Hinzufügen ausgewertet, nicht beim
Duplicates
Delphi-Quellcode:
. Das Property ist eben keine Garantie für den Inhalt der Stringlist. Es kann insbesondere jederzeit zwischen zwei
Sort
Delphi-Quellcode:
-Aufrufen geändert werden.
Add
|
AW: String in TStringList finden verschnellern?
Das Sorted setze ich nur im Nachhinein auf True, damit ich Find() benutzen kann.
Ob es doppelte Einträge gibt oder nicht ist unwichtig. Es dürfte aber normalerweise eh keine geben. |
AW: String in TStringList finden verschnellern?
Liste der Anhänge anzeigen (Anzahl: 5)
Hallöle...:P
Weil keiner Erbarmen hatte des TDictionary mit der TStringList zu vergleichen mache ich das mal... Ich wollte es auch mal wissen. :wink: Geschwindigkeit: Das Dictionary ist ist schneller. :thumb: Vorgaben: Range: 10000000 Items TStringList: unsortiert. (die Werte liegen sortiert vor) Ergebnis: Bei der TStringList liegen die Zeiten bei ca. 100 - 950 Milisekunden. Beim TDictionary stabil bei 0 ms. (:gruebel: Ich wollte es gar nicht glauben.) Natürlich muß man die Zeit berücksichtigen in der die Listen aufgebaut werden. Das stand aber nicht zur Debatte...:thumb: Jetzt könnt ihr es auseinandernehmen. :thumb:
Delphi-Quellcode:
unit Unit1;
interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, System.UITypes, System.Generics.Collections, System.Generics.Defaults, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls; type TBlubb = class strict private FItemValue: Integer; public constructor Create(ItemValue: Integer); property ItemValue: Integer read FItemValue write FItemValue; end; TfmTest = class(TForm) btnStringList: TButton; btnDictionary: TButton; edtCount: TEdit; btnGenerate: TButton; procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); procedure btnStringListClick(Sender: TObject); procedure btnGenerateClick(Sender: TObject); procedure btnDictionaryClick(Sender: TObject); private FDictionary: TObjectDictionary<string, TBlubb>; FStringList: TStringList; procedure Generate; function Count(StartValue: Cardinal): Cardinal; public end; var fmTest: TfmTest; implementation {$R *.dfm} procedure TfmTest.FormCreate(Sender: TObject); begin FDictionary := TObjectDictionary<string, TBlubb>.Create([doOwnsValues]); FStringList := TStringList.Create; Randomize; end; procedure TfmTest.FormDestroy(Sender: TObject); begin FDictionary.Free; FStringList.Free; end; procedure TfmTest.Generate; var I: Integer; ItemsCount: Integer; Value: TBlubb; begin FDictionary.Clear; FStringList.Clear; ItemsCount := Random(StrToInt(edtCount.Text)); for I := 0 to ItemsCount - 1 do begin Value := TBlubb.Create(I); FDictionary.Add(IntToStr(I), Value); FStringList.AddObject(IntToStr(I), Value); end; MessageDlg(Format('%d values generiert.', [ItemsCount]), mtInformation, [mbOK], 0); end; function TfmTest.Count(StartValue: Cardinal): Cardinal; begin Result := GetTickCount - StartValue; end; procedure TfmTest.btnGenerateClick(Sender: TObject); begin Generate; end; procedure TfmTest.btnStringListClick(Sender: TObject); var Start: Integer; SearchKey: Integer; SearchValue: TBlubb; ItemPosition: Integer; begin Start := GetTickCount; SearchKey := Random(FStringList.Count - 1); ItemPosition := FStringList.IndexOf(IntToStr(SearchKey)); SearchValue := TBlubb(FStringList.Objects[ItemPosition]); MessageDlg(Format('TStringList: Zeit in Milisekunden (Item # %s, Value: %d): %d', [IntToStr(SearchKey), SearchValue.ItemValue, Count(Start)]), mtInformation, [mbOK], 0); end; procedure TfmTest.btnDictionaryClick(Sender: TObject); var Start: Integer; SearchKey: Integer; SearchValue: TBlubb; begin Start := GetTickCount; SearchKey := Random(FStringList.Count - 1); FDictionary.TryGetValue(IntToStr(SearchKey), SearchValue); MessageDlg(Format('TDictonary: Zeit in Milisekunden (Item # %s, Value: %d): %d', [IntToStr(SearchKey), SearchValue.ItemValue, Count(Start)]), mtInformation, [mbOK], 0); end; { TBlubb } constructor TBlubb.Create(ItemValue: Integer); begin inherited Create; FItemValue := ItemValue; end; end. |
AW: String in TStringList finden verschnellern?
Zitat:
|
AW: String in TStringList finden verschnellern?
Hallo... :P
Zitat:
|
AW: String in TStringList finden verschnellern?
Zitat:
Ich kann es zwar auch nicht in drei Worten erklären (ebenfalls Ü40), aber hier es gibt in der Wikipedia diesen Artikel : https://de.wikipedia.org/wiki/Landau...e_und_Notation Bei binärer Suche (TStringList zum Beispiel) hat man O (log n), die Zugriffszeit wächst ungefähr um einen konstanten Betrag, wenn sich das Argument verdoppelt. |
AW: String in TStringList finden verschnellern?
Zitat:
Again what learned. (Loddar) :lol: |
AW: String in TStringList finden verschnellern?
Zitat:
|
AW: String in TStringList finden verschnellern?
Das müssen den TE fragen. Er kämpft mit den Milisekunden... :wink:
|
AW: String in TStringList finden verschnellern?
Zitat:
Delphi-Quellcode:
sollte das Problem erledigt sein :stupid:
Sleep(600);
|
AW: String in TStringList finden verschnellern?
Zitat:
Gruß K-H |
AW: String in TStringList finden verschnellern?
Zitat:
Denn der Unterschied zwischen 1 Minute und 5 Sekunden ist schon gewaltig. |
AW: String in TStringList finden verschnellern?
Zitat:
Wenn sich die Liste oft ändert, aber nur selten darauf zugegriffen wird, dann kann die Suche langsamer sein, aber das Hinzufügen/Löschen/Ändern sollte schnell sein, aber wenn die Liste sich selten ändert und oft gesucht wird, dann natürlich andersrum. Und dann kann man noch unterscheiden wie die Liste gefüllt wird. Wird sie einmal schnell gefüllt und es gibt zwischendrin keine Zugriffe, dann kann man dabei die Sortierung/Indizierung aus lassen (falls möglich) und führt das erst nach dem Befüllen durch. (beim Dictionary nicht möglich, aber bei der TStringList, wenn man beim Befüllen selber auf Dupplikate achtet) |
AW: String in TStringList finden verschnellern?
Zitat:
|
AW: String in TStringList finden verschnellern?
Jain.
Bei der Vergrößerung der Liste müssen ab und an mal alle Einträge neu positioniert werden, wenn der interne Speicher die Größe ändert. |
AW: String in TStringList finden verschnellern?
Hat noch keiner einen AVL-Baum ausprobiert? :-D
Der ist beim Einfügen und beim Suchen recht schnell. |
AW: String in TStringList finden verschnellern?
Zitat:
|
AW: String in TStringList finden verschnellern?
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:45 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