Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   String/Integer Paare verwalten (https://www.delphipraxis.net/154798-string-integer-paare-verwalten.html)

Shark99 25. Sep 2010 19:51

Delphi-Version: 7

String/Integer Paare verwalten
 
Ich suche einen schnellen und unkomplizierten weg um String/IntegerPaare zu speichern, z.B. solche Daten

Meyer=1
Mueller=2743
Schmied=65

Ich habe es zuerst mit einer StringList und .Names bzw .Values gemacht. Es funktionierte und war leicht zu implementieren, aber bei grossen Datenmengen ist es sehr langsam.

Eine verketette Pointerliste von Records wäre auch eine Möglichkeit, fand sie aber etwas zu kompliziert, vor allem da in anderen Sprachen solche Sachen extrem einfach sind, z.B. in Lua geht es mit mytable = {}; mytable.Meyer=1;

Am Ende bin ich bei Collections gelandet. Es ist zwar schnell, aber der Code ist doch ganz schön umständlich und mit Pech rennt man in external Exceptions rein, weil es Com Objekte sind.

Deshalb meine Frage, ob es eine schnelle Lösung für das Problem gibt (für mein nächstes Projekt dann).

implementation 25. Sep 2010 19:53

AW: String/Integer Paare verwalten
 
Kennt dein Delphi das generische TDictionary?

Namenloser 25. Sep 2010 21:09

AW: String/Integer Paare verwalten
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zur effizienten Verwaltung von Schlüssel-Wert-Paaren bietet sich eine Hashmap an. Ich habe z.B. für eines meiner aktuellen Projekte so eine implementiert, und da ich sowieso vorhatte, die früher oder später mal in der CodeLib zu veröffentlichen, kann ich das ja vorab auch hier schon mal tun. Das Hinzufügen von etwas mehr als einer Million Items schafft meine Hashmap in 0.6 Sekunden, das anschließende Auslesen all dieser Items dauert zusammen 0.4s auf meinem Rechner (Vista 32Bit, 2.4Ghz Quad, 3GB DDR-2 RAM).

Derzeit im Angebot habe ich allerdings nur eine String-String-Map und eine Widestring-Object-Map, wobei letztere recht speziell auf mein Projekt angepasst ist, sodass ich sie mal außen vor gelassen habe. Weitere Varianten wie String-Integer-Maps oder Integer-String-Maps usw. hatte ich noch vor zu implementieren, bevor ich die Klasse in der CL veröffentliche, bin aber noch nicht dazu gekommen.

Das ganze ist aber bewusst so konzipiert, dass man mit relativ wenig Aufwand neue Varianten von der Basisklasse ableiten kann. Eine String-Integer-Map sollte sich damit also auch recht einfach umsetzen lassen. Ich hänge die Sourcen mal hier an, vielleicht kannst du ja was damit anfangen.

Uwe Raabe 25. Sep 2010 23:12

AW: String/Integer Paare verwalten
 
Zitat:

Zitat von Shark99 (Beitrag 1051901)
Ich habe es zuerst mit einer StringList und .Names bzw .Values gemacht. Es funktionierte und war leicht zu implementieren, aber bei grossen Datenmengen ist es sehr langsam.

Dann versuch doch mal eine StringList, wo du den Integer als TObject gecastet in dem Objects-Property speicherst. Wenn du die StringLIst dann auf Sorted := true stellst, sollte es dann schneller gehen. Also etwa so:

Delphi-Quellcode:
list := TStringList.Create;
list.Sorted := true;
list.AddObject('Meyer', TObject(1));
list.AddObject('Mueller', TObject(2743));
list.AddObject('Schmied', TObject(65));
...
idx := list.IndexOf('Mueller');
val := Integer(list.Objects[idx]);

taveuni 26. Sep 2010 10:24

AW: String/Integer Paare verwalten
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1051933)
Zitat:

Zitat von Shark99 (Beitrag 1051901)
Ich habe es zuerst mit einer StringList und .Names bzw .Values gemacht. Es funktionierte und war leicht zu implementieren, aber bei grossen Datenmengen ist es sehr langsam.

Dann versuch doch mal eine StringList, wo du den Integer als TObject gecastet in dem Objects-Property speicherst.

Und dann noch nicht Stringlist sondern THashedStringlist dann ist die Suche auch unheimlich schnell.

Namenloser 26. Sep 2010 15:52

AW: String/Integer Paare verwalten
 
Zitat:

Zitat von taveuni (Beitrag 1051972)
Und dann noch nicht Stringlist sondern THashedStringlist dann ist die Suche auch unheimlich schnell.

Meine Hashmap ist aber schneller :D


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