![]() |
AW: String/Integer Hash
Zitat:
|
AW: String/Integer Hash
Zitat:
Zitat:
Delphi-Quellcode:
var
test: TDictionary<string,string>; ValueArray: TArray<string>; CurrentValue: string; begin test := TDictionary<string,string>.Create; try test.Add('a1', 'bb'); test.Add('a2', 'abb'); test.Add('a3', 'cbb'); test.Add('a4', 'xbb'); ValueArray := test.Values.ToArray; TArray.Sort<string>(ValueArray); for CurrentValue in ValueArray do ShowMessage(CurrentValue); finally test.Free; end; |
AW: String/Integer Hash
Ein Hash lässt sich nicht unbedingt eindeutig einem String zuordnen.
Es kann für einen Hash also mehrere gültige Strings geben. Das primäre Problem wurde bereits angesprochen. Warum werden für die Feldnamen bei der Erzeugung einer Objekt-Instanz jedesmal neue Strings erzeugt? Mit Konstanten wird für jedes Feldobjekt nur ein Zeiger benötigt:
Delphi-Quellcode:
Falls das nicht möglich ist, könnte man TMyField.Create überschreiben.
constructor TMyData.Create();
begin inherited; FID := TMyField.Create(Self, 'ID'); FBezeichnung := TMyField.Create(Self, 'BEZEICHNUNG'); FTag1 := TMyField.Create(Self, 'TAG1'); FTag2 := TMyField.Create(Self, 'TAG2'); FTag3 := TMyField.Create(Self, 'TAG3'); FTag4 := TMyField.Create(Self, 'TAG4'); FTag5 := TMyField.Create(Self, 'TAG5'); FTag6 := TMyField.Create(Self, 'TAG6'); FTag7 := TMyField.Create(Self, 'TAG7'); end; oder const TagFieldName: array [1..7] of string = ('TAG1', 'TAG2', 'TAG3', 'TAG4', 'TAG5', 'TAG6', 'TAG7'); constructor TMyData.Create(); begin inherited; FID := TMyField.Create(Self, 'ID'); FBezeichnung := TMyField.Create(Self, 'BEZEICHNUNG'); for i := 1 to 7 do FTag[i] := TMyField.Create(Self, TagFieldName[i]); end; aber nicht! so: constructor TMyData.Create(); begin inherited; FID := TMyField.Create(Self, 'ID'); FBezeichnung := TMyField.Create(Self, 'BEZEICHNUNG'); // für jedes Feld in jeder Instanz einen neuen String erzeugen! for i := 1 to 7 do FTag[i] := TMyField.Create(Self, 'TAG' + IntToStr(i)); end; Die übergebene Zeichenkette wird in einem globalen Dictionary gesucht. Wenn erforderlich, wird dieses ergänzt. Der String aus dem Dictionary wird als Feldname verwendet, es erhöht sich nur dessen Referenzzähler. Wird der übergebene String nicht weiter verwendet, wird der Speicher dafür automatisch freigegeben. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:18 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 by Thomas Breitkreuz